串口的数据解析代码
/** * 函数名:UART1_Handler() * 功能: 串口1的中断服务函数 * 入口参数:无 * 引脚: 无 * USART1_RX_STA:串口一的接收状态标志位 * USART1_BUFF[USART1_Length]:缓冲区(存储数据),串口长度 */ u16 USART1_RX_STA; u16 USART1_BUFF[USART1_Length]; void USART1_IRQHandler() { u8 Res; if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET) { Res=USART_ReceiveData(USART1); if((USART1_RX_STA&0X8000)==0) { if(USART1_RX_STA&0x4000) { if(Res == 0x0a) { USART1_RX_STA = USART1_RX_STA|0x8000; } else { USART1_RX_STA = 0; } } else { if(Res != 0x0d) { USART1_BUFF[USART1_RX_STA&0x3FFF]=Res; USART1_RX_STA++; if(USART1_RX_STA>(USART1_Length-1)) { USART1_RX_STA=0; } } else { USART1_RX_STA = USART1_RX_STA|0x4000; } } } } }
15bit | 14bit | 13bit~0bit |
判断0x0d | 判断0x0a | 数据位,用来存储数据 |
代码流程图推导:假设接收到 a,b , c , d , 0x0d , 0x0a(0x0d,0x0a是\r\n的ascii码)
- 流程图
总而言之,你假设几个接收数据(a,b,c,d,0x0d,0x0a),然后带进函数里面跑一下,就能清楚它的原理
相关知识
问:串口中断中能用延迟函数吗?
答:
- 中断中延时占了资源,中断不能停留太久等待,所以中断中一定不能用原本的delay函数
- 怎么样才能让中断中嵌套delay函数呢?STM32在中断里使用SysTick_delay延时引起的一些异常死机bug分析及其解决方案
相关代码:串口通信数据包解析