HAL库串口中断接收
1.利用CubeMX配置串口1
(1)配置串口1波特率为9600,波特率设置的太高有时会收不到消息,我碰到过。然后开启串口中断,在中断中接收数据。但是不要在中断中处理数据,中断中尽量少做一些事情 ![](https://img2018.cnblogs.com/blog/1392333/201811/1392333-20181117151546465-760941921.jpg)2.编程中用到的函数
(1)HAL库中提供了很多串口操作的函数,有轮询模式收发,中断模式收发和DMA模式收发,我这里用的是中断模式 ![](https://img2018.cnblogs.com/blog/1392333/201811/1392333-20181117152634637-733885637.jpg) (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为单缓冲区,接收一个字节时可用 ![](https://img2018.cnblogs.com/blog/1392333/201811/1392333-20181117161400924-742162294.jpg) (3)在main()函数中while()之前开启串口接收中断,填好相关参数,HAL_UART_Receive_IT(&huart1,&RxTemp1,1);这里这么设置,先把数据保存到RxTemp1,然后再在回调函数中保存到RxBuffer1中,是为了把串口发来的数据完整的存储在RxBuffer1中,方便我进行其他处理 ![](https://img2018.cnblogs.com/blog/1392333/201811/1392333-20181117193658312-151646064.jpg) (4)实现回调函数,这里有两种方法,方法一可以保存数据再进行操作,方法二直接发送数据,不进行操作,仔细看图中注释 ![](https://img2018.cnblogs.com/blog/1392333/201811/1392333-20181117193924518-2055357068.jpg) (5)在while中的处理 ![](https://img2018.cnblogs.com/blog/1392333/201811/1392333-20181117200437982-1957774276.jpg)4.补充说明
(1)至此,串口实验基本完成。在这里说一下我项目里碰到的另外一个问题,我里面有两个串口通信要处理,先要在程序里发送数据到串口3,然后要把串口3反馈的内容进行一些处理后发送到串口1,这时候需要把开启中断函数里(HAL_UART_Receive_IT(&huart3,&RxBuffer3[RxCounter3++],1);)的数据缓冲区直接设为全局数组,然后回调函数里直接写开启中断的函数即可,不再需要RxTemp1标志位,但是要注意每次程序发送数据后要延迟200ms,不然数据会收不到。看图中针对串口3的操作即可 ![](https://img2018.cnblogs.com/blog/1392333/201811/1392333-20181117195002322-88334606.jpg)![](https://img2018.cnblogs.com/blog/1392333/201811/1392333-20181117195051999-1217580915.jpg) ![](https://img2018.cnblogs.com/blog/1392333/201811/1392333-20181117195138369-506610281.jpg)