金牌会员
 
- 积分
- 1790
- 金钱
- 1790
- 注册时间
- 2018-3-26
- 在线时间
- 294 小时
|
8金钱
本帖最后由 htao 于 2019-12-3 17:14 编辑
用的一款扫地机器人上的激光模块,数据格式如下:
<start> <index> <speed_L> <speed_H> [Data 0] [Data 1] [Data 2] [Data 3] <checksum_L> <checksum_H>
FA E8 F1 75 65 02 4B 2F 6C 02 FF 2D 73 02 9A 2C 80 02 CF 2A 00 00
一般一包数据就是上面的长度22字节,现在使用STM32F103C8模块进行的数据传输,用串口3进行接收和解析。
问题就在这儿,这个激光模块一秒可以发送400包左右的数据。
方法一:利用串口接收标志位,接收一包 USART3_RX_STA 置位,用完复位 USART3_RX_STA 再接收下一包的数据,这样每接收一包会丢失 三包数据,丢失量太大了不行。
方法二:弄一个串口循环队列,一边接收一边解析,但是还是接收数据太快了,一下就把队列占满,导致后面的数据接收不到,每次需要用一点才能再继续接收
,数据也不能连续。想着队列弄大点,满了就清空队列,只损失一部分,但能保证大部分的数据和连续性,但是这个实践出来效果很差,可能还有问题在继续找。
方法三:DMA接收,直接解析数据,DMA的用法还不太熟,数据也不太连续和丢失较多,还没仔细调试。
目标:目标就是激光模块每秒传输400包数据过来(大约400 * 22 = 8.8k), 能保证大部分连续有效的数据,比如连续400包,我接收并处理连续的50包,再丢失10包左右,
再连续接收处理50包,丢失一些这样。
这个跟芯片103的性能应该没关系吧,是程序处理的问题吧?大家有没有好用的一些方法,麻烦指导下,给个思路或者有类似例程的。。。
 
|
最佳答案
查看完整内容[请看2#楼]
这个模块一圈也就90个包,处理方法是申请了90个包的数组,进中断就直接判断属于第几包然后直接存放到数组里面,
程序里面再取用数组里的数据,虽然在取用数据的时候,会被中断打断,改变数据值,但是正好是最新的数据,符合要求,
中断只写,处理只读,所以不会造成其他的冲突。
|