HAL库串口中断接收

1.利用CubeMX配置串口1

(1)配置串口1波特率为9600,波特率设置的太高有时会收不到消息,我碰到过。然后开启串口中断,在中断中接收数据。但是不要在中断中处理数据,中断中尽量少做一些事情



2.编程中用到的函数


(1)HAL库中提供了很多串口操作的函数,有轮询模式收发,中断模式收发和DMA模式收发,我这里用的是中断模式

(2)这里用到的三个函数,我说一下他们的意思,其他函数类似
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef huart, uint8_t pData, uint16_t Size);
//该函数功能为开启串口接收中断,并指定存储接收数据的缓存区,设置从串口接收的数据大小。这里要特别注意,该函数只有从串口接收到Size个数据后才会返回,不然会阻塞。
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef huart, uint8_t pData, uint16_t Size, uint32_t Timeout);
//该函数功能为发送数据到指定串口,pData为数据地址,Size为数据大小,Timeout为超时时间。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
//该函数为串口接收完数据后的回调函数,在串口中断中,会依次调用以下这些函数:USART1_IRQHandler(),HAL_UART_IRQHandler(&huart1),UART_Receive_IT(),HAL_UART_RxCpltCallback()。回调函数在主函数中可以自己实现,HAL库只有定义,没有具体实现,我们可以在回调函数中做一些处理,来处理我们得到的数据。


3.代码实现


(1)这里做一个简单的串口与上位机串口助手通信的实验,将串口助手发送给开发板串口1的数据回发到串口助手。注意,在利用CubeMX生成的代码进行编程时,自己添加的代码一定要加在各种“BEGIN”和“END”之间。
(2)首先在main中设置全局变量uint8_t RxCounter1=0,RxBuffer1[50]={0},RxTemp1=0,F_Usart1=0;用来保存从串口收到的数据,F_Usart1为接收完成标志,在while中会一直检测它是否变化,然后进行相关操作。RxTemp1为单缓冲区,接收一个字节时可用

(3)在main()函数中while()之前开启串口接收中断,填好相关参数,HAL_UART_Receive_IT(&huart1,&RxTemp1,1);这里这么设置,先把数据保存到RxTemp1,然后再在回调函数中保存到RxBuffer1中,是为了把串口发来的数据完整的存储在RxBuffer1中,方便我进行其他处理

(4)实现回调函数,这里有两种方法,方法一可以保存数据再进行操作,方法二直接发送数据,不进行操作,仔细看图中注释

(5)在while中的处理



4.补充说明


(1)至此,串口实验基本完成。在这里说一下我项目里碰到的另外一个问题,我里面有两个串口通信要处理,先要在程序里发送数据到串口3,然后要把串口3反馈的内容进行一些处理后发送到串口1,这时候需要把开启中断函数里(HAL_UART_Receive_IT(&huart3,&RxBuffer3[RxCounter3++],1);)的数据缓冲区直接设为全局数组,然后回调函数里直接写开启中断的函数即可,不再需要RxTemp1标志位,但是要注意每次程序发送数据后要 延迟200ms,不然数据会收不到。看图中针对串口3的操作即可




猜你喜欢

转载自www.cnblogs.com/yf4695/p/9975230.html