STM32学习笔记(6) 串口通信数据包解析
·
串口的数据解析代码
/**
* 函数名: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分析及其解决方案
相关代码:串口通信数据包解析
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)