使用HAL库实现的串口通信详解

首先对STM32MX进行配置,先开启外部时钟。

配置时钟,具体多少M可以按自己喜欢配置(可以直接配置HCLK回车就行,没有标红就说明可以); 开启USART,波特率,IO口啥的默认就行也可以自己修改;

 很重要一点,一定要开启接收中断,不然不能接收,我这里把DMA中断也开了,感觉DMA好用一点。

 这里添加DMA中断就行ADD;

改一下输出配置; 

生产keil代码;

 

先定义一下参数

	uint8_t aRxBuffer[1];			//接收中断缓冲
	uint8_t Uart1_RxBuff[256] = {0};		//接收缓冲
	uint8_t Uart1_Rx_Cnt = 0;		//接收缓冲计数
	uint8_t Uart1_RxFlag = 0;
	uint8_t	cAlmStr[] = "数据溢出(大于256)\r\n";
	uint8_t correct[] = {1,2,3,4,5,6};

发送就比较简单,直接调用函数,传入四个参数,串口号,数据,数据长度,应答时长;

	HAL_UART_Transmit(&huart1,(uint8_t*)Uart1_RxBuff,Uart1_Rx_Cnt,1000);
	//发送的数据

中断发送就不需要应答时长;

	HAL_UART_Transmit_IT(&huart1,(uint8_t*)Uart1_RxBuff,Uart1_Rx_Cnt);
	//发送的数据

接收数据,需要先开启中断;

    HAL_UART_Receive_DMA(&huart1,aRxBuffer,20);
    __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);

编写接收中断函数;

//串口接收,需要发送固定标志位 回车
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_UART_TxCpltCallback could be implemented in the user file
   */
 	if(huart->Instance==USART1)//如果是串口1
	{
		if(Uart1_Rx_Cnt >= 255)  //溢出判断
		{
			Uart1_Rx_Cnt = 0;
			memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff));
			HAL_UART_Transmit(&huart1, (uint8_t *)&cAlmStr, sizeof(cAlmStr),0xFFFF);	
		}
		else
		{
			Uart1_RxBuff[Uart1_Rx_Cnt++] = aRxBuffer[0];   //接收数据转存
		
			if((Uart1_RxBuff[Uart1_Rx_Cnt-1] == 0x0A)&&(Uart1_RxBuff[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位
			{
				Uart1_RxFlag = 1;						//接收完成标志位 
			}
		}
		
		HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);   //再开启接收中断
	}
}

主函数,把接收到的数据发送回去就行。

		if(Uart1_RxFlag != 0)
    {
		HAL_UART_Transmit(&huart1,(uint8_t*)Uart1_RxBuff,Uart1_Rx_Cnt,1000);	//发送接收到的数据
		while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)!=SET);		//等待发送结束
		printf("\r\n\r\n");   //插入换行;	
        Uart1_Rx_Cnt = 0;
        memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff));
    }
//		

 想使用printf函数发送的话,得重定义一下,报错的话,加一个stdio.h就行。


///选择串口发送数据的类型
#define		HAL_USART		1	///<HAL阻塞串口发送数据
//#define	HAL_USART_DMA	1	///<HAL_DMA串口发送数据

/**
 * @brief		定义printf函数结构体
 * 	
 */
struct FILE { 
	int handle; 

}; 

/**
 * @brief		重定向printf函数到串口
 * 	
 */
int fputc(int ch, FILE * f){
	#ifdef HAL_USART
		HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);///<普通串口发送数据
	#elif HAL_USART_DMA
    	HAL_UART_Transmit_DMA(&huart1,(uint8_t *)&ch,1);///<DMA串口发送数据
	#endif
    
  while(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TC) == RESET){}///<等待发送完成
    
  return ch;
}

这是阻塞式接收发送,非阻塞得用DMA发送。

物联沃分享整理
物联沃-IOTWORD物联网 » 使用HAL库实现的串口通信详解

发表评论