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

2019-08-14 02:53发布

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

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

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

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


请指教,谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
caosix
1楼-- · 2019-08-14 06:33
依照 STM32 CPU 的 基本处理速度 72MHz 。
串口115200Bit/s的速度,可以支持六个串口全双工
串口——速度若是降低,可以支持更多的“口数”。。

前提条件是:该CPU的 任何一个中断内斗不能
有过份耗时的循环、比较、延迟等语句,各个
中断处理必须【简洁而高效】。

计算依据:115200 —— 码元时间 约 10uS ,
一个字节时间是100uS ,全双工减半为 50uS;
六个串口 同时工作:50uS / 6 = 【8.33uS】。

8.33uS 的CPU负荷周期内,必须完成,
否则丢数据。你算一下 该周期内 CPU
能运行多少条指令。不满足就换更快的CPU。

xsx127
2楼-- · 2019-08-14 12:20
 精彩回答 2  元偷偷看……
聚东风
3楼-- · 2019-08-14 14:58
收到完整数据才会触发中断,你可以让CPU跑快点嘛,
极致点的说,你让中断立即把数据读掉(一般只要缓冲池足够,DMA可以干的),然后设置标志位,再立即退出,
一般而言,串口的速率肯定跑不过你CPU的,
我觉得你多虑了,只要你不把CPU弄成蜗牛,串口弄成高铁
钩月黄昏
4楼-- · 2019-08-14 20:43
用串口空闲中断配合DMA完成接收,然后将接收到的添加到接收队列中去。然后处理。
Acuity
5楼-- · 2019-08-15 01:07
1、开DMA;
2、增加缓冲区(FIFO);
3、上RTOS;
newbuff
6楼-- · 2019-08-15 03:35
Acuity 发表于 2017-9-5 08:45
1、开DMA;
2、增加缓冲区(FIFO);
3、上RTOS;

Rtos 能否给个思路,现在感觉是串口中断彼此打断,Rtos如何判断一帧数据接收完毕?

一周热门 更多>