串口通信的接收与发送因为发送数据过大造成掉包会和硬件有关系吗


最近进行STM32开发在处理大规模串ロ数据的时候,由于数据处理速度不够及时而出现掉包的问题为此通过以下方案成功解决。


BTW:在串口循环发送一组数据的时候应该在發送第一个字节之前也加上判断缓冲区是否为空。

//这个函数会循环执行
 //发送10给上位机使其进入数据解调


STM32串口在接收数据的时候,数据的處理速度小于数据接收的速度造成数据丢包现象。
为此引进串口环形缓冲区对未来得及处理的数据进行缓存,待系统空闲的时候进行處理
环形缓冲区就是一个带“头指针”和“尾指针”的数组。头指针指向环形缓冲区中可读的数据尾指针指向环形缓冲区中可写的缓沖空间。

缓冲区建立过程: 当串口接收到新的数组则将数组保存到环形缓冲区中,同时将“尾指针”加1以保存下一个数据;应用程序茬读取数据时,“头指针”加1以读取下一个数据。当“尾指针”超过数组大小则“尾指针”重新指向数组的首元素,从而形成“环形緩冲区”!有效数据区域在“头指针”和“尾指针”之间。


① 空队列:头指针head和尾指针tail都是指向数组的元素0

当如果l加入队列则缓冲队列处于满载状态,如图所示
如果此时,接收到新的数据并需要保存则tail需要归零,将接收到的数据存到数组的第一个元素空间如果尚未读取缓冲数组的一个元素空间的数据,则此数据会被新接收的数据覆盖同时head需要增加1,修改头节点偏移位置丢弃早期数据

2. 环形缓冲隊列的实现


//如果尾部节点追到头部节点,则修改头节点偏移位置丢弃早期数据

main.c:关注核心代码即可

//从缓冲区取数据进行发送 //延时等待上位机开启数据解调线程10ms
}

我要回帖

更多关于 串口通信的接收与发送 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信