STM32 HAL库串口Cubemx使用指南:简单的串口收发函数介绍

1.串口发送函数(简单的,仅此一家)     

				HAL_UART_Transmit(&huart1 , box , uart_reci_Data, 0xff);

          以下为函数原型,但建议看看我的介绍

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

我的介绍:

由以上的代码块看到,他有4个参数

第1:选用哪个串口,这里选用的是usart1

第2:这里的box呢,是我上边定义的一个数组,全局变量,用来存放串口将要发送的数据 

第3:这个uart_reci_Data是自定义的宏变量,我这里给了它的值为4,用于确认多少个字节1次发出,看看下面的例子

第4:是时间,可以设置数值,使其在一定时间内完成接受,若超出这个时间,就直接跳出这个串口接收函数,一般可以给100,或者0xff之类的,单位这里先不考虑

SO:例子

如果有

    #define uart_reci_Data 4
    uint8_t box[4] = {0x01,0x02,0x33,0x44};
    int main()
{
        
    HAL_UART_Transmit(&huart1 , box , uart_reci_Data, 0xff);
        while(1)
     {

     }

}

 意思就是,我stm32外部串口1发送数据,要求串口1 在0xff个单位时间里把数组box[4]的数据发送出去,以一个字节(8bit)为最小单位发送,然后4个字节4个字节(即uart_reci_Data的值)为一份,一次就发一份,也就是发box[4]里的4个元素;如果我们在外面接收的话,就会收到串口1发送的0x01,0x02,0x33,0x44

2.串口接收(使用中断的,需要两家)

第一家

是    HAL_UART_Receive_IT  ,它用来开启对应串口中断

	HAL_UART_Receive_IT	(&huart1 , box , uart_reci_Data);

我的介绍:

第1:选用哪个串口,这里选用的是usart1

第2:接收到的数据存放与哪个数组,这里是box[4],与上面一样的定义

第3:这个uart_reci_Data是自定义的宏变量,我这里给了它的值为4,用于确认1次收多少个字节,等下看看下面的例子,

这个很重要,它决定你接下来每次调用接收函数时,一次接收多少个字节的数据

第二家(注意:它是个单独的函数,要在main外写)

是    void HAL_UART_RxCpltCallback,它是中断回调函数,用于接受到数据后进入串口中断,可以对数据进行处理,也可以干点别的事情 ,他甚至有个模板

	void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
                if(huart == &huart1)						   //因此此处需要认一下是哪个串口收到数据
			{
				while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX)   //检测UART发送结束,保证已经完全接收数据,不会丢包

                HAL_UART_Receive_IT	(&huart1 , box , uart_reci_Data);	//再次打开中断,因为单片机每执行一次中断回调函数,就默认下一次不再执行	
            }
}

解释:

1.  if那里,确定是哪个串口,因为其他串口也会进入这个中断回调函数的

2.  while那里是保证数据不丢包

3.  最后一个就是上面的第一家函数,使用它是为了  再次打开中断,因为单片机每执行一次中断回调函数,就默认下一次不再执行

SO:例子,注意:(void HAL_UART_RxCpltCallback)和int main在一个文件下

      #define uart_reci_Data 4	
      uint8_t box[4] = {0};
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//Sept 2: 中断回调函数,执行:接受到东西后,就进入该函数
	{													   //都不用调用,每次串口接受到数据就会自动进入此函数
			if(huart == &huart1)						   //因此此处需要认一下是哪个串口收到数据
			{
				while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX)   //检测UART发送结束
				
				
				HAL_UART_Transmit(&huart1 , box , uart_reci_Data, 0xff);

				HAL_UART_Receive_IT	(&huart1 , box , uart_reci_Data);	//再次打开中断,因为单片机每执行一次中断回调函数,就默认下一次不再执行		
			}
	}

    int main()
{
    HAL_UART_Receive_IT	(&huart1 , box , uart_reci_Data);//先开启一次中断,因为它是默认不开中断的
    while(1)
    {


    }
}

意思就是,我外部串口1发送给stm32的数据将会被串口1截取,以一个字节(8bit)为最小单位截取,然后4个字节4个字节(即uart_reci_Data的值)为一份,要求串口1 在0xff个单位时间里收取,并存入数组box中,4个为一份,存入一份box[4]中,这里设置刚刚好4个萝卜(串口1收到的数据)4个坑(box[4]的4个元素,一个元素为一个字节,因为上面定义了box是uint8_t的)

然后再次调用HAL_UART_Transmit,再次发送box里的数据,这里用来验证串口1 是都接收到准确数据,Then,再次打开中断,以保证下一次串口1 接收到数据时能够进入串口中断回调函数

当然

你还可以在HAL_UART_RxCpltCallback里做点别的时,比如开关灯之类的,这个由你自己定义,接收到数据的同时做点事情

作者:大米~¥

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 HAL库串口Cubemx使用指南:简单的串口收发函数介绍

发表评论