如何确保多串口同时工作不丢失数据?

2019-08-14 02:53发布

STM32串口1和2分别接了两个串口设备,不定时会有数据传上来,格式是自定义的帧数据,有包头,长度,校验等部分。目前用串口空闲中断来作为判断收到一帧的标志,但是因为两个串口的中断有优先级,如果低优先正在接收一帧过程中,被高优先级的打断,低优先的就无法收到完整的一帧。
如果设置为同等优先级,那么串口1在收的时候,串口2有数据了只能等,这样串口2可能会被新来的数据覆盖,从而丢失。(这一点不知道是否正确)

还有如果串口发送的时候被串口接收中断打断了,是否就说明串口无法成功发送这一帧,而是分成了多部分发送的?

像串口这种情况改怎么处理好,如何保证多串口同时工作不丢失数据?还有什么方法能较好解析收到的数据?一般只接一个串口,所以用空闲中断很容易得到一帧数据,然后直接对这个帧进行解析。如果一帧数据分多次发过来,怎么判断为好?之前用51的时候,接收数据放在接收中断里,用状态机一个个字节判断,不知道现在有什么好的方法没有?

DMA这些还没有学会,也不知道DMA能否完美解决这些问题。


请指教,谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
caosix
1楼-- · 2019-08-15 05:03
 精彩回答 2  元偷偷看……
aiyeba
2楼-- · 2019-08-15 07:24
newbuff 发表于 2017-9-5 09:41
Rtos 能否给个思路,现在感觉是串口中断彼此打断,Rtos如何判断一帧数据接收完毕?

我觉得你误会了一个事情。就是说串口2的优先级更高。

你自己可以看看,我们在讲究时时性的时候就是要反映够快。

假如,我现在在接收串口1的数据,串口2的来了。你为什么要打断他呢?

人家接收完成绝对小于1ms的。这点时间你都等不了。


那你想想定时器的标志位,时间到了,但是在while查询的时候刚好跑了一圈

这个时间都有几ms了。

所以,你可以这样设置,俩个串口的抢占优先级一样,就是不会打断。子优先级串口2高。

然后是把发送端的发送速度降低一些。延时1ms都够了。

如果俩个发送端的时间间隔都小于1ms    上面的话当我没说。





xlong_06
3楼-- · 2019-08-15 08:40
你这个你只要想着STM32作为绝对的主机就行了,就是通过指令控制你的从机什么时候发数据,什么时候不发数据,这样你把控好就可以的。如果主从很混淆的话,你这个就没法做,RTOS也不一定能做。
Acuity
4楼-- · 2019-08-15 14:21
newbuff 发表于 2017-9-5 09:41
Rtos 能否给个思路,现在感觉是串口中断彼此打断,Rtos如何判断一帧数据接收完毕?

中断都有优先级的,加上dma处理,以串口的速率还是能应对的。像stm32的串口不带硬件fifo确实是个缺陷,nxp的就有,一分钱一分货吧。
caosix
5楼-- · 2019-08-15 18:39
Acuity 发表于 2017-9-5 23:15
中断都有优先级的,加上dma处理,以串口的速率还是能应对的。像stm32的串口不带硬件fifo确实是个缺陷,nx ...

硬件 FIFO 也有 深度够不够 的问题啊。

多任务系统,如果任务调度时间:大于

FIFO 的 深度x码元时间,仍然会丢数据。
黑黑
6楼-- · 2019-08-15 20:24
 精彩回答 2  元偷偷看……

一周热门 更多>