STM32 UART Rx中断数据接收相关函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if(huart->Instance==DEBUG_UART) {
if((DEBUG_UART_RX_STA&0x8000)==0) {
if(DEBUG_UART_RX_STA&0x4000) {
if(DEBUG_UART_aRxBuffer[0]==0x0A) {
DEBUG_UART_RX_BUF[DEBUG_UART_RX_STA&0x3FFF] = '\n';
DEBUG_UART_RX_STA++;
DEBUG_UART_RX_STA |= 0x8000;
}
else DEBUG_UART_RX_STA = 0;
} else {
if(DEBUG_UART_aRxBuffer[0]==0x0D) {
DEBUG_UART_RX_BUF[DEBUG_UART_RX_STA&0x3FFF] = '\r';
DEBUG_UART_RX_STA++;
DEBUG_UART_RX_STA |= 0x4000;
}
else {
DEBUG_UART_RX_BUF[DEBUG_UART_RX_STA&0x3FFF] = DEBUG_UART_aRxBuffer[0];
DEBUG_UART_RX_STA++;
if(DEBUG_UART_RX_STA>(USART_BUF_SIZE-1)) DEBUG_UART_RX_STA = 0;
}
}
}
}
DEBUG_UART_RX_STA为u16(unsigned int)类型,存储数值范围0~65535,对应二进制最大值(0b1111 1111 1111 1111),
我们规定DEBUG_UART_RX_STA二进制第一二位为结束符标志位,第一位代表接收到\n,第二位代表接收到\r,当依次接收到\r\n时,代表串口接收完成。
剩余十四位为串口接收字符串长度,去除第一二位,最大值用二进制计数表示为0b0011 1111 1111 1111,即十六进制0x3FFF,通过按位与运算得出接收数据长度,所以长度的计算为 DEBUG_UART_RX_STA&0x3FFFF,DEBUG_UART_RX_STA能记录的最大长度为0x3FFF = 16383。
4 comments
不错不错,我喜欢看 https://www.ea55.com/
这篇文章写得深入浅出,让我这个小白也看懂了!
非常感谢你分享这篇文章,我从中学到了很多新的知识。
看到你的文章,感觉很不错,想与你友情链接
网站名:电脑教程网
网站:https://dnjcw.com.cn/
同意的话给我发邮件Internetyewu@163.com