STM32F1+RTT串口接收终端数据丢失问题

发布于 2016-06-21 17:45:20
使用STM32F103,72Mhz主频,用RTT的串口驱动方式,以接收终端方式,配置了回调函数rt_err_t uart_input(rt_device_t dev, rt_size_t size),进入函数后使用rt_device_read读取数据。因为这种方式每次进入回调函数都是接收到1个字节,所以每次进去就调用rt_device_read取回buf,发现连续接收数据的时候,丢数据严重。9600波特率,串口助手连续发8个字节,只能收到5个字节。我在中断函数rt_hw_serial_isr中加了计数器,发现进入的次数也是5。回调函数里只有rt_device_read一个操作,没有其他代码,去掉这个函数后,接收数据个数正常。不知道为什么rt_device_read会消耗那么久的时间。之前用的F407,同样是接收每一个字节就进入回调的方式,回调函数里很多判断和处理代码,没有发现丢包情况。实在是搞不清怎么回事了~~~~不知道哪位遇到过,或者有什么思路可以解决这个问题?

注:如果定期去调用rt_device_read,而不采用中断方式,实时性就下来了。。。。。。。而且通信协议不定长,不能根据数量一次性rt_device_read读取。

查看更多

关注者
0
被浏览
2.9k
5 个回答
aozima
aozima 2016-06-21
拒绝白嫖,拒绝键盘侠!
驱动是有buf的,buf是工作在中断状态下,9600肯定丢不了数据。

read可以一次读取多个数据,但即使每次1个,也不会丢。
至少finsh默认用115200也没见丢。

建议好好查下原因。

如果需要更高速率,可以改进驱动的处理方式,但9600都丢则是有错误末找到。
jackedison911
jackedison911 2016-06-21
现在确实不知道应该从哪里找原因,如果不使用read的话,中断函数rt_hw_serial_isr响应次数是没有问题的,它里面有buf,是serial_device结构体里面的一个结构体,这里面的数据应该是不会丢的。所以现在我个人认为是read里面的代码写的不好。但是这是官方提供的,不知道从哪里去修改了,没有思路了。
须弥指间
须弥指间 2018-08-31
不知道楼主找到原因没,我也遇到了 ,困惑中
swet123
swet123 2020-09-18

使用方法有问题。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览