STM32F7使用链队列从串口接收数据出现漏掉字节的问题

2019-07-20 02:56发布


我是用原子的F7开发板,试了下使用链队列从串口接收数据,串口接收数据波特率为115200,一边收一边在main函数while(1)中检测队列是否为空,不空则将数据发送出来,但是当发送大量数据时时不时就会少几个字节,如果使用数组实现队列就不会出现这种问题,链队列中malloc使用C库函数和原子的内存管理都试过,都会出现漏字节的问题,想问下这种情况怎么回事呢?是malloc执行太耗时间了吗?如果在while(1)中再加一些其他的代码,漏字节的现象更严重了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
ZHDX
1楼-- · 2019-07-20 03:25
看来你没有用中断模式.

这样你的代码每次读uart的间隔越长, 漏字符的可能性就越大.

最佳的方法还是中断加ringbuff , 然后在非中断的代码里读取ringbuff数据.

ringbuff的大小决定了你在外面能有多长时间的处理间隔.

我是传奇1
2楼-- · 2019-07-20 07:03
 精彩回答 2  元偷偷看……
ZHDX
3楼-- · 2019-07-20 11:25
我是传奇1 发表于 2019-3-26 15:41
我确实是在串口中断里读取字符的,队列我用的也是循环队列

但是你说的 "链队列" 是用 malloc 的啊..

一般 ringbuff 是预先分配好的, 不会临时分配.
我是传奇1
4楼-- · 2019-07-20 15:19
ZHDX 发表于 2019-3-26 15:44
但是你说的 "链队列" 是用 malloc 的啊..

一般 ringbuff 是预先分配好的, 不会临时分配.

用数组实现队列才需要预先分配内存,用链表实现队列的目的就是想的是用的时候才分配,每个队列都可以分配不同大小的内存
ZHDX
5楼-- · 2019-07-20 17:48
 精彩回答 2  元偷偷看……
我是传奇1
6楼-- · 2019-07-20 22:12
ZHDX 发表于 2019-3-26 16:03
那样不现实.

malloc的执行时间是很不稳定的.

“malloc的执行时间是不稳定的”这句话怎么说?我刚刚用systick测试了一下C库函数的malloc,分配一个链表节点的时间大约是100个tick,F7跑216M,每个tick是1/216us,100个tick就大约是0.5us,而原子的内存管理malloc分配一个节点大约是500个tick,也就大约是2.5us,115200bps每次中断的时间是69us,怎么会处理不完呢?

一周热门 更多>