打印
[MCU]

关于串口接收数据处理的问题

[复制链接]
3959|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一叶倾城wwq|  楼主 | 2018-12-27 11:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 一叶倾城wwq 于 2018-12-28 09:52 编辑

串口接收数据,比如固定接收30字节,开辟30字节接收缓冲区,由服务器下发到MCU,正常测试方法,也就是接收正确正常指令数据没什么疑问,我的处理方法是接收到最后一个字节后20ms开始处理判断数据,但在写程序时考虑到如果因为一些非人为的因素导致:一直有数据不间断的发过来(<=20ms),持续一千个字节(比如),在防止边界溢出情况下,我的缓冲区不可能处理得了这么多数据,30+1都不行,也就是接收到了错误信息,但可能头30个字节是正确的,后续是错误的,又或者中间30个字节是正确的。
请问:这样的情况如何处理好一些,是直接回复error(虽然这样简单些,但可能不太人性化)?
后注:数据格式如下:帧头、命令类型、长度、数据、校验和、帧尾。
因各位坛友的指教画出中心问题:考虑异常情况下,数据处理跟不上接收的速度,且不能再开缓冲区,都知道便宜的MCU就128RAM

相关帖子

沙发
xmar| | 2018-12-27 12:01 | 只看该作者
1. 接收用字节中断, 每接收一个字节中断一次;
2. 服务器发送的有效帧除了发送数据外,还必须有固定的帧头,地址、帧长,校验位,帧结束符等额外开销字节;
3.收到帧头,后面的字节才开始送入缓冲区;
4. MCU主程序处理完缓冲区,将缓冲区清零。

使用特权

评论回复
板凳
一叶倾城wwq|  楼主 | 2018-12-27 14:26 | 只看该作者
xmar 发表于 2018-12-27 12:01
1. 接收用字节中断, 每接收一个字节中断一次;
2. 服务器发送的有效帧除了发送数据外,还必须有固定的帧头 ...

是的,我在一楼的问题没提数据帧格式,额外开销是必须的,按您的意思接收到帧头(比如68/FE之类的),必须第一帧正确才往缓冲区存放?那就是在接收中断里做了数据比较,这样一两行代码到时可以支撑,接收中断里加多了会漏跑代码的吧?
还有一个问题想请教,就是我接受完一包数据后在主程序处理,如果处理的比较繁琐占用时间,而在处理的过程中又有数据下发,这不把我缓冲区里的数据改变了吗?正常情况肯定时不会出现的,但异常情况应该要考虑进去的吧,此时我是否需要再弄一个接受数据并处理完的标志,就是在处理数据时不接收数据,不放如缓冲区,数据来了也是白来。

使用特权

评论回复
地板
blust5| | 2018-12-27 14:44 | 只看该作者
缓冲区是缓冲区,帧头正确之后放入缓冲区,够一帧之后从缓冲区读取出来再处理,这样即使有新数据也不耽误接收。

使用特权

评论回复
5
blust5| | 2018-12-27 14:45 | 只看该作者
现在一般用的比较多的是环形缓冲区。就是如果接收溢出,会把最早接收到的数据覆盖掉。当然处理的时候可以加上防溢出处理。

使用特权

评论回复
6
一叶倾城wwq|  楼主 | 2018-12-27 15:24 | 只看该作者
blust5 发表于 2018-12-27 14:44
缓冲区是缓冲区,帧头正确之后放入缓冲区,够一帧之后从缓冲区读取出来再处理,这样即使有新数据也不耽误接 ...

何为“够一帧”?接收缓冲区刚好放满?刚要处理,又接着下发数据呢?如果处理的速度跟不上下发的速度呢?处理得过来吗?

使用特权

评论回复
7
一叶倾城wwq|  楼主 | 2018-12-27 15:30 | 只看该作者
blust5 发表于 2018-12-27 14:45
现在一般用的比较多的是环形缓冲区。就是如果接收溢出,会把最早接收到的数据覆盖掉。当然处理的时候可以加 ...

环形?也就是每次只取最末段那个数据来处理?要是还没读就被覆盖了呢?我还是觉得处理时不接收保险些可能是我想多了吧

使用特权

评论回复
8
blust5| | 2018-12-27 17:01 | 只看该作者
一叶倾城wwq 发表于 2018-12-27 15:24
何为“够一帧”?接收缓冲区刚好放满?刚要处理,又接着下发数据呢?如果处理的速度跟不上下发的速度呢? ...

环形缓冲区一般都会开辟存储三到五帧数据需要的空间,如果可以确保通讯速度不会很快,也可以少开辟一些,这个根据实际应用定。
够一帧可以采用两种方法识别,一种就是你说的超出20ms没有接到数据认为一帧数据已经接收完成,另一种就是识别帧结束字符,识别到结束符则认为一帧数据已经接受完全。

使用特权

评论回复
9
blust5| | 2018-12-27 17:05 | 只看该作者
一叶倾城wwq 发表于 2018-12-27 15:30
环形?也就是每次只取最末段那个数据来处理?要是还没读就被覆盖了呢?我还是觉得处理时不接收保险些[em: ...

环形缓冲区有两个指针,一个存入指针 一个读取指针,初始化时两个指针重合,表明环形缓冲区为空。接收到数据则存入指针累加,导致两个指针不等,表明缓冲区已经存入数据;读取时读取指针累加,当读取指针追上存入指针时,表明存储的数据已经全部读取处理完成,缓冲区又空了。两个指针不相干,处理数据时,新数据来到,则按照规则根据存入指针的位置存入数据,不会影响已经读取出来的数据处理。处理完数据之后发现两个指针又不一样了,表明有新数据进来了,可以再次读取处理。

使用特权

评论回复
10
blust5| | 2018-12-27 17:07 | 只看该作者
一叶倾城wwq 发表于 2018-12-27 15:30
环形?也就是每次只取最末段那个数据来处理?要是还没读就被覆盖了呢?我还是觉得处理时不接收保险些[em: ...

处理数据时不接收,则容易出现丢包现象,即有一些数据可能在你处理的时候发过来,这时候你不响应,就会造成数据丢失。

使用特权

评论回复
11
dinguyue| | 2018-12-27 19:45 | 只看该作者
数据格式

使用特权

评论回复
12
座机呀| | 2018-12-27 21:52 | 只看该作者
如果你和服务器约定好最短的帧间隔是20ms,而服务器却错误地以小于这个间隔发送数据的话,我认为在下位机方面对这种情况做处理是没有意义的.
至于你想实现的环形缓冲来应对当你仍在处理上一帧数据时到来的新一帧数据,你可以根据你实际应用的波特率,你响应帧的最小频率,估算一个环形缓冲的深度.
至于怎么实现,可以参考安富莱的bsp_uartfifo里面的思路写一个.

使用特权

评论回复
评论
一叶倾城wwq 2018-12-28 09:56 回复TA
出问题出怕了,有的客户可不管这些,比较不好解释,哈哈,所以我才想着异常发的太快就算我这里丢掉一些也没我什么事,没按约定来嘛,O(∩_∩)O哈哈~ 
13
blust5| | 2018-12-28 08:25 | 只看该作者
本帖最后由 blust5 于 2018-12-28 08:26 编辑
来了方法 发表于 2018-12-27 20:13
既然是中断接收何来不响应,难道处理环形缓冲区数据时关总中断?

楼主说的,处理数据的时候 不接收。。。我是不推荐这种做法的,容易丢包。。。

使用特权

评论回复
14
一叶倾城wwq|  楼主 | 2018-12-28 09:04 | 只看该作者
来了方法 发表于 2018-12-27 16:01
中断接收放环形缓冲区,根据发数据包大小开缓冲区!

我说了是异常情况,属于未知的“发数据包大小”

使用特权

评论回复
15
一叶倾城wwq|  楼主 | 2018-12-28 09:06 | 只看该作者
来了方法 发表于 2018-12-27 16:05
都有间隔的,不可能连续发100ms的,的都有间隔几十ms的。

是的,正常情况都有间隔的,留有对方处理数据的时间的

使用特权

评论回复
16
blust5| | 2018-12-28 09:30 | 只看该作者
一叶倾城wwq 发表于 2018-12-28 09:04
我说了是异常情况,属于未知的“发数据包大小”

既然是异常情况,丢一部分数据又如何?难道领导让你一周时间完成一个月的工作量,你也要按时按量完成???

使用特权

评论回复
17
一叶倾城wwq|  楼主 | 2018-12-28 09:44 | 只看该作者
blust5 发表于 2018-12-27 17:05
环形缓冲区有两个指针,一个存入指针 一个读取指针,初始化时两个指针重合,表明环形缓冲区为空。接收到 ...

受教了,之后搭个环境试下这个方法

使用特权

评论回复
18
一叶倾城wwq|  楼主 | 2018-12-28 09:47 | 只看该作者
blust5 发表于 2018-12-27 17:07
处理数据时不接收,则容易出现丢包现象,即有一些数据可能在你处理的时候发过来,这时候你不响应,就会造 ...

是啊,数据短一些还好说,数据长的话,处理跟不上接收,我这样的弊端就是肯定丢包,但现在讨论的就是处理跟不上就收的情况

使用特权

评论回复
19
一叶倾城wwq|  楼主 | 2018-12-28 09:48 | 只看该作者

数据格式如下:帧头、命令类型、长度、数据、校验和、帧尾。

使用特权

评论回复
20
一叶倾城wwq|  楼主 | 2018-12-28 09:59 | 只看该作者
blust5 发表于 2018-12-28 09:30
既然是异常情况,丢一部分数据又如何?难道领导让你一周时间完成一个月的工作量,你也要按时按量完成?? ...

是的,就是想这么干,异常情况关我什么事,只要咱别死机一直接收就行,所以来和各位请教下,这样干有多大弊端

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

79

主题

1296

帖子

11

粉丝