发新帖我要提问
12
返回列表
打印
[MCU]

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

[复制链接]
楼主: 一叶倾城wwq
手机看帖
扫描二维码
随时随地手机跟帖
21
Ketose| | 2018-12-28 10:13 | 只看该作者 回帖奖励 |倒序浏览
楼主这种情况,我觉得还是用双缓冲比较好。一个接收缓冲,一个处理缓冲。

使用特权

评论回复
22
一叶倾城wwq|  楼主 | 2018-12-28 10:33 | 只看该作者
Ketose 发表于 2018-12-28 10:13
楼主这种情况,我觉得还是用双缓冲比较好。一个接收缓冲,一个处理缓冲。 ...

好方法,这个方法我见一个前辈写的程序就是这样处理的,要牺牲存储空间,不过必要时可以一试

使用特权

评论回复
23
大大hello| | 2018-12-28 15:50 | 只看该作者
非常好

使用特权

评论回复
24
追夜| | 2018-12-28 19:27 | 只看该作者
最好是基于数据流开始解码数据,比如,每来一个数据,就判断是否是帧头,然后判断msg id之类的

使用特权

评论回复
25
一叶倾城wwq|  楼主 | 2018-12-29 08:38 | 只看该作者
追夜 发表于 2018-12-28 19:27
最好是基于数据流开始解码数据,比如,每来一个数据,就判断是否是帧头,然后判断msg id之类的 ...

来一个处理一个?那最后的校验和也还是要保存之前的数据才能计算的啊,不过这样效率倒是可以一试。

使用特权

评论回复
26
hwpga| | 2018-12-29 12:16 | 只看该作者
本帖最后由 hwpga 于 2018-12-29 12:44 编辑

我用单主单从的轮询来给你讲讲
一主多从,假设有3个从机地址分别为,01,02
主机超时20MS,带3次重发机制
主机发送第一帧数据地址号为01
正常下01号从机接收到数据解析,在20MS内解析上报给主机,则ERROR1=0;
非正常下01号从机没上报给主机,主机在超时20MS后,没接收到数据,则ERROR1++
主机依次发送第二帧数据地址号为02
正常下02号从机接收到数据解析,在20MS内解析上报给主机,则ERROR2=0;
非正常下02号从机没上报给主机,主机在超时20MS后,没接收到数据,则ERROR2++;
主机依次发送第三帧数据地址号为01
正常下01号从机接收到数据解析,在20MS内解析上报给主机,则ERROR1=0;
非正常下01号从机没上报给主机,主机在超时20MS后,没接收到数据,则ERROR1++;
主机依次发送第四帧数据地址号为02
正常下02号从机接收到数据解析,在20MS内解析上报给主机,则ERROR2=0;
非正常下02号从机没上报给主机,主机在超时20MS后,没接收到数据,则ERROR2++;
当EEROR1或ERROR2>=3次时,主机就知道从机故障了,主机还是不停的轮询发送地址1和2,等待从机上线
单主单从也一样
从机的任务只是在有接收到帧数据的情况下,解析上报数据给主机
主机如果在超时20MS后没接收到返回数据,就要重新发送帧数据给从机
从机的串口程序我习惯会在串口的中断里直接用状态机处理掉,接一个处理一个
如果你能保证串口程序在主函数里在主机规定的时间20MS内处理并且上报,那么你可以放主程序
你的从机如果是20MS超时,你的主机起码得是从机的1.5-2倍超时时间
如果是上位机->主机->从机这种可以不用ERROR,无论有无数据都要上报给上位机
我会用无效的数据类型帧+出错地址代替




使用特权

评论回复
27
hwpga| | 2018-12-29 12:21 | 只看该作者
简单说单主单从的轮询,从机只负责在规定时间内返回数据
至于数据错了或数据没收到,从机不用理会就对了
主机在超时后,没接收到从机的数据,就该想,我应该重新给它在发一次

使用特权

评论回复
28
山东电子小菜鸟| | 2018-12-29 14:20 | 只看该作者
学习了

使用特权

评论回复
29
一叶倾城wwq|  楼主 | 2018-12-29 15:29 | 只看该作者
hwpga 发表于 2018-12-29 12:16
我用单主单从的轮询来给你讲讲
一主多从,假设有3个从机地址分别为,01,02
主机超时20MS,带3次重发机制

感谢您的指导,有两点疑问:1、某一台丛机故障,等待丛机上线这儿,是一直等待吗?如果这台丛机坏了或者就没有接,我觉得就隔一段时间询问一次就好了吧,或者有更好的处理方式?
2、“从机的串口程序我习惯会在串口的中断里直接用状态机处理掉,接一个处理一个”,我是不是可以理解为数据解析就直接放在接收中断里面?并且缓冲区可以只用一个字节接收?那就很考验代码效率了,不然有出现漏解析的可能。

使用特权

评论回复
评论
hwpga 2018-12-29 15:58 回复TA
你可以参考下吴坚鸿的串口接收数据中断那一段 I2C和SPI从机模式下都是直接在中断里用switch处理数据的 
30
一叶倾城wwq|  楼主 | 2018-12-29 15:41 | 只看该作者
hwpga 发表于 2018-12-29 12:21
简单说单主单从的轮询,从机只负责在规定时间内返回数据
至于数据错了或数据没收到,从机不用理会就对了
主机 ...

是的,丛机有丛机的错误机制,主机也有自己的错误机制,这样出错时大家都都知道了,就重新下发一次数据就好

使用特权

评论回复
评论
hwpga 2018-12-29 16:08 回复TA
从机只要有数据和协议对的,就返回上报给主机. 数据没接受到或错误的,就不管了,这笔就丢掉. 主机超时后,没接受到从机上报数据,主机就要重发数据给从机. 
31
hwpga| | 2018-12-29 15:47 | 只看该作者
本帖最后由 hwpga 于 2018-12-29 16:10 编辑
一叶倾城wwq 发表于 2018-12-29 15:29
感谢您的指导,有两点疑问:1、某一台丛机故障,等待丛机上线这儿,是一直等待吗?如果这台丛机坏了或者 ...

1:无论从机有无故障,主机还是依次间隔轮询从机,EERROR>=3次了,EERROR=3;
只要从机上线上报了ERROR=0;
2:检测到帧头后,缓冲区开始接受数据
用switch  case 0: 1: 2 :  直接在串口中断里处理
你自己慢慢理理思路,参考了自己改改适用自己的需求

使用特权

评论回复
32
一叶倾城wwq|  楼主 | 2018-12-29 17:29 | 只看该作者
hwpga 发表于 2018-12-29 15:47
1:无论从机有无故障,主机还是依次间隔轮询从机,EERROR>=3次了,EERROR=3;
只要从机上线上报了ERROR=0;
2:检 ...

好的,多谢指点

使用特权

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

本版积分规则