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

2019-07-20 02:56发布


我是用原子的F7开发板,试了下使用链队列从串口接收数据,串口接收数据波特率为115200,一边收一边在main函数while(1)中检测队列是否为空,不空则将数据发送出来,但是当发送大量数据时时不时就会少几个字节,如果使用数组实现队列就不会出现这种问题,链队列中malloc使用C库函数和原子的内存管理都试过,都会出现漏字节的问题,想问下这种情况怎么回事呢?是malloc执行太耗时间了吗?如果在while(1)中再加一些其他的代码,漏字节的现象更严重了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
edmund1234
1楼-- · 2019-07-21 18:30
我是传奇1 发表于 2019-3-26 18:44
解决问题当然容易,我当然知道用数组写个循环队列就能搞定,我只是搞清楚用链队列出问题的原因在哪

单凭你一楼提供的一点点信息, 只能猜了, 我猜你的问题在发送那里, 是用库函数发的吧?
我是传奇1
2楼-- · 2019-07-21 19:18
 精彩回答 2  元偷偷看……
edmund1234
3楼-- · 2019-07-21 20:15
我是传奇1 发表于 2019-3-26 19:18
串口发送数据除了使用库函数还有什么办法呢

寄存器啊, 其实问题不在库函数, 而在库函数的工作方式, 发送后就在哪儿死停, 等到发送完成才退出, 发一个字节的时间就等于收一个字节的时间啊, 你再来个SYSTICK中断, 那来足够的时间给你处理接收?
当然, 你说的问题能有n个可能性, 我只是根据仅有的信息猜的
ZHDX
4楼-- · 2019-07-21 21:45
剩下的只能靠你自己了.  毕竟是你自己写的代码, 又没POST上来.

我也只能靠最可能的方向去找原因.

IRQ的要求很高, 除了时限问题, 还有一个问题是 "线程安全"

也就是说你的关键代码也很容易因为被中断而产生各种诡异的问题.

所以像FreeRTOS这种操作系统才会做出任务间通信机制,  包括IRQ


又或者什么原因都不是呢? 只是代码有BUG

一周热门 更多>