用过HAL库的坛友想必对串口接收中断函数
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
中的 参数 uint16_t Size 深恶痛绝,我看到这个函数心里就在想,我又不知道我可能接收到多少数目的字符串,这个参数怎么给,因此通常情况下,我都是用的阻塞接收函数
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
最近想到一种思路(借鉴原子的思路),不仅可以使用串口接收中断函数,还可以通过结尾为 0x0d 0x0a(即回车换行)判断接收结束
每次中断接收一个字符,
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
- {
- if(huart == &huart6)
- {
- if((USART_RX_STA&0x8000)==0)//接收未完成
- {
- if(USART_RX_STA&0x4000)//接收到0x0d
- {
- if(cc2541_rx_at_buff[USART_RX_STA & 0x3FFF]!=0x0a)USART_RX_STA=0;//接收错误,重新开始
- else
- {
- USART_RX_STA|=0x8000; //接收完成
- }
- }
- else //还没收到0x0d
- {
- if(cc2541_rx_at_buff[USART_RX_STA & 0x3FFF]==0x0d)
- {
- USART_RX_STA|=0x4000;
- USART_RX_STA++;
- HAL_UART_Receive_IT(&huart6,&cc2541_rx_at_buff[USART_RX_STA & 0x3FFF],1);
- }
- else
- {
- USART_RX_STA++;
- if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始
- HAL_UART_Receive_IT(&huart6,&cc2541_rx_at_buff[USART_RX_STA & 0x3FFF],1);
- }
- }
- }
- }
- }
复制代码 其中
- uint8_t cc2541_rx_at_buff[USART_REC_LEN];
- //接收状态
- //bit15 接收完成标志
- //bit14 接收到0x0d
- //bit13 接收到有效字节数目
- uint16_t USART_RX_STA=0; //接收状态标记
复制代码- #define USART_REC_LEN 200 //定义最大接收字节数
复制代码 在主函数里面,就可以这样写
- HAL_UART_Receive_IT(&huart6,&cc2541_rx_at_buff[0],1);
- while( (USART_RX_STA & 0x8000) == 0);
- //
- 自己的代码
- //
- uint8_t i=0;
- for(i=0;i< (USART_RX_STA & 0x3FFF); i++)
- cc2541_rx_at_buff[i] = '\0';
- USART_RX_STA = 0;
复制代码
|
是的,但这里可以一次性接收最多为200字节的字符串,以 0x0d 0x0a 结束,这样就可以不用知道要接收多少个字节了
楼主主函数那段代码应该是放在while(1)里面吧,所以不用加
什么叫一个字节式的接收啊
HAL_UART_Receive_IT,它的中断接受,你设置的是每次中断接收一个字节,不是啊?
需要接收到数据就马上进行处理的话可以修改it.c里的串口中断irqhandler
嗯,自己的思想+库函数就是创新!