原文链接:http://www.openedv.com/posts/list/53847.htm
f(USART_RX_STA&0x40) { if(Res!=0x0a) { USART_RX_STA=0;// } else { USART_RX_STA|=0x80; } } ======================================= 关于原子历程里面的这段函数 如果数据包里含有0x01 0x02 0x03 0x0d 0x03 0x05 0x0d 0x0a 这种数据是不是就接收不到我想要的数据了啊 有点疑问 |
最佳答案
毫无疑问是的,
0D 0A这是自行定义的一种数据帧结束标志,不定义这个不没法判断你这一帧数据什么时候结束了,0D 0A是什么东西咧,它就是我们的回车键的ASCII码, 0D回车,0A换行
像在windows超级终端里一条数据输入完按回车正好来了个0D 0A,表示数据发完了
串口如何检测数据接收完毕或串口接收超时,这个问题是个老大难问题,没有好的协议支持,就要浪费单片机大量的资源去解决这个问题。
比如浪费一个定时器,每次在中断里接到一个字节就开启定时器去记时,9600大概1MS一个字节,定时器到3MS中断检查有没收到数据了就表示数据帧结束了,
又比如串口绑在DMA通道上,通过串口的空闲中断来判断接收完成
问题在于现在有大量的工业通讯协议如MODBUS等没有帧结束标志,实在令人发指