你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

串口数据解析疑问-求助各位大神

[复制链接]
su-409464 提问时间:2018-3-7 11:18 /
现在手上有一个串口模块要开发,比较复杂,

功能:接收各种类型不定长度的 字符串,然后解析做出反馈

字符串基本规格:
单条命令 : CMD(X,Y,'ABC或者中文字符不定长',W);
结束符号: \r\n

最终串口接收字符串是: 命令+结束符  ======》 CMD(X,Y,'ABC或者中文字符不定长',W); \r\n

特殊情况1:
有时是几条命令一起过来, 如: CMD(X,Y,'aaaa',W);CMD(X,Y,'bbb',W);CMD(X,Y,'啊啊啊啊',W); \r\n


特殊情况2:
发送端是不定时发送,可能突然发送连续两条
CMD(X,Y,'1111',W);
\r\n CMD(X,Y,'22222',W);\r\n



问题:

对于以上两种特殊情况,
1. 请问串口设置为中断模式 接收数据 可行么?
2. 串口中断的条件是什么? 比如一条
CMD(X,Y,'ggg',W);
\r\n  ,串口是收到 “C” 第一字符之后 就中断吗? 还是整句接收完才中断?

3. 中断后,串口还接收数据吗? 比如CMD(X,Y,'ggg',W); \r\n 发送过来,正在中断里面接收数据,此时又来一条,那么串口会不会继续接数据进来?

4. 接收数据时 是在串口中断中边接收 边解析好呢?  还是直接读空串口, 存在buffer, 到主程序 外面进行解析 好呢?

5. 是否需要 用DMA 方式进行接收?

6. 接收到数据之后,主程序 需要进行反馈(可能包括一些IO 操作,读取flash 等等),如果在此期间,串口又来数据了,但是不想被接收动作打断同时又能把数据 接过来,等这些反馈动作完成后, 再去分析这些数据(不错过它)  可能吗?如何实现?


收藏 评论8 发布时间:2018-3-7 11:18

举报

8个回答
hxydj 回答时间:2018-3-7 11:43:47
可以分两种情况处理:
1,不考虑头尾只要来数据都接收存储,然后在慢慢分析接收到的数据。这种接收方式的话不用判断数据,用时间卡,比较只要串口中断进来就接收数据,并且开始计时,如果在指定时间内比如10ms内有数据进来,就计数器清零。如果计时器的值超过10ms,则认为本次串口接收数据结束。然后统一区分析处理接收到的数据。
2,根据协议通过头尾接收数据,如果接收到C则标记准备接收数据,并且开始计数接收到1个字节,然后依次判断第2个字节是M,第3个字节是D,如果前三个字符是CMD则开始正式接收数据,将接收到的数据存储起来,如果接收到了\r 则标记准备结束,如果接收到\n则标记结束完成。本次数据存储结束,清空所有标志位。然后置接收结束标志位,主程序判断接收结束后就去处理本次接收到的数据,然后中断中继续接收下一组数据。
疯de_恒 回答时间:2018-3-7 11:59:26
1.最好设置为中断接收,不会错过数据。
2.串口中断是每接收到一个字节进入中断处理。
3.中断处理的过程,串口还继续工作,但最好在中断中只接收保存数据,处理数据放在主函数执行。
4.同上。
5.DMA也是可以的,注意别溢出了。及时处理。
6.肯定可以的。如果只是IO操作,完全可以串口中断接收数据啊,反正影响不大。如果这个期间不能被打断,那就只能用DMA收数据了。把收到的但未来得及处理的命令保存下来,有空了就慢慢执行回复吧。

评分

参与人数 1ST金币 +6 收起 理由
MrJiu + 6 很给力!

查看全部评分

wenyangzeng 回答时间:2018-3-7 13:51:20
楼主其实可以在社区先搜索一下,许多网友关于“串口不定长”通讯。
比如:
https://www.stmcu.org.cn/module/ ... D%E5%AE%9A%E9%95%BF
su-409464 回答时间:2018-3-7 15:06:52
hxydj 发表于 2018-3-7 11:43
可以分两种情况处理:
1,不考虑头尾只要来数据都接收存储,然后在慢慢分析接收到的数据。这种接收方式的话 ...

谢谢你的回复。

你说的第1种方法,定时有点像 使用DMA , 定义一个buffer ,然后轮询去检测buffer 里面有没有数据。取出来进行解析,这个能否避免命令 “断节” 的问题呢?  比如再取buffer的时候,突然进来了下一个命令的 前半部分数据, 尤其是发送端是突然不定时的发送数据。

至于第2种方法  是否就是 写一个状态机 之类的东西,然后再串口中断函数中去判断 接收的数据,但是这样如果数据中间一个byte 不对了, 整个命令就不对了,  丢包现象不知道会不会 很严重?
su-409464 回答时间:2018-3-7 15:11:42
す疯Ⅱ恒す 发表于 2018-3-7 11:59
1.最好设置为中断接收,不会错过数据。
2.串口中断是每接收到一个字节进入中断处理。
3.中断处理的过程,串 ...

关于5,
你说 注意别溢出, 但是发送端 是不定时突发性发送的, 这边不能控制其发送的速度 和数据量,
如果溢出了,如何处理? DMA 可以设一个上限  过了 就停止串口接收 , 设一个下限低了继续接收 这样可行吗?

关于6, 除了IO 操作 ,还有一些SPI flash 的读写, LCD 屏控制, 时间上可能需要一些时间。
所以只能用 DMA 读数据,DMA 读的话是不是也是放在一个buffer, 这个buffer 空不空, 存量什么  硬件有标志位吗? 还是应用层的一个数组 而已?
su-409464 回答时间:2018-3-7 15:13:54
wenyangzeng 发表于 2018-3-7 13:51
楼主其实可以在社区先搜索一下,许多网友关于“串口不定长”通讯。
比如:
https://www.stmcu.org.cn/module/fo ...

谢谢你, 这个帖子我看过, 但是 定时轮询的方法  对于发送端不定时突发性的 特点 , 是否适合呢?

ST 的 DMA 硬件标志位上有没有 关于缓存区 是否有数据,能否设上下限的 功能?
wenyangzeng 回答时间:2018-3-7 15:27:22
su-409464 发表于 2018-3-7 15:13
谢谢你, 这个帖子我看过, 但是 定时轮询的方法  对于发送端不定时突发性的 特点 , 是否适合呢?

ST  ...

每次断帧中断,一定能接收到整帧数据,应该不难进行数据处理的。
疯de_恒 回答时间:2018-3-7 16:05:52
su-409464 发表于 2018-3-7 15:11
关于5,
你说 注意别溢出, 但是发送端 是不定时突发性发送的, 这边不能控制其发送的速度 和数据量,
如 ...

可以利用DMA传数据到一个环形数组作缓冲,循环填充数据,有数据及时处理,数据处理延迟的最长时间内串口可能会收到多少数据,然后定义稍微大一点的数组即可。
举例:比如你最长10ms才处理收到的数据,如果你的波特率是115200,那么10ms内最多会收到100+个数据,你把DMA数组设置为200就不怕溢出了。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版