OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4075|回复: 17

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

[复制链接]

12

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2012-1-13
在线时间
29 小时
发表于 2017-9-5 02:55:17 | 显示全部楼层 |阅读模式
1金钱
STM32串口1和2分别接了两个串口设备,不定时会有数据传上来,格式是自定义的帧数据,有包头,长度,校验等部分。目前用串口空闲中断来作为判断收到一帧的标志,但是因为两个串口的中断有优先级,如果低优先正在接收一帧过程中,被高优先级的打断,低优先的就无法收到完整的一帧。
如果设置为同等优先级,那么串口1在收的时候,串口2有数据了只能等,这样串口2可能会被新来的数据覆盖,从而丢失。(这一点不知道是否正确)

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

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

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


请指教,谢谢!

最佳答案

查看完整内容[请看2#楼]

依照 STM32 CPU 的 基本处理速度 72MHz 。 串口115200Bit/s的速度,可以支持六个串口全双工 串口——速度若是降低,可以支持更多的“口数”。。 前提条件是:该CPU的 任何一个中断内斗不能 有过份耗时的循环、比较、延迟等语句,各个 中断处理必须【简洁而高效】。 计算依据:115200 —— 码元时间 约 10uS , 一个字节时间是100uS ,全双工减半为 50uS; 六个串口 同时工作:50uS / 6 = 【8.33uS】。 8.33uS 的CPU ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

89

主题

579

帖子

0

精华

高级会员

Rank: 4

积分
859
金钱
859
注册时间
2014-9-30
在线时间
146 小时
发表于 2017-9-5 02:55:18 | 显示全部楼层
依照 STM32 CPU 的 基本处理速度 72MHz 。
串口115200Bit/s的速度,可以支持六个串口全双工
串口——速度若是降低,可以支持更多的“口数”。。

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

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

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

回复

使用道具 举报

117

主题

598

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
1702
金钱
1702
注册时间
2012-5-10
在线时间
439 小时
发表于 2017-9-5 08:30:32 | 显示全部楼层
按照你说的,没办法保证,cpu只有一个核,所以不要考虑绝对的同时事件,推荐队列,中断收发
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2017-9-5 08:42:02 | 显示全部楼层
收到完整数据才会触发中断,你可以让CPU跑快点嘛,
极致点的说,你让中断立即把数据读掉(一般只要缓冲池足够,DMA可以干的),然后设置标志位,再立即退出,
一般而言,串口的速率肯定跑不过你CPU的,
我觉得你多虑了,只要你不把CPU弄成蜗牛,串口弄成高铁
回复

使用道具 举报

7

主题

185

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2729
金钱
2729
注册时间
2015-12-27
在线时间
469 小时
发表于 2017-9-5 08:43:46 | 显示全部楼层
用串口空闲中断配合DMA完成接收,然后将接收到的添加到接收队列中去。然后处理。
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2017-9-5 08:45:40 | 显示全部楼层
1、开DMA;
2、增加缓冲区(FIFO);
3、上RTOS;
回复

使用道具 举报

12

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2012-1-13
在线时间
29 小时
 楼主| 发表于 2017-9-5 09:41:58 来自手机 | 显示全部楼层
Acuity 发表于 2017-9-5 08:45
1、开DMA;
2、增加缓冲区(FIFO);
3、上RTOS;

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

使用道具 举报

89

主题

579

帖子

0

精华

高级会员

Rank: 4

积分
859
金钱
859
注册时间
2014-9-30
在线时间
146 小时
发表于 2017-9-5 09:51:51 | 显示全部楼层
俺之前 一个 回答是 基于【单字节 处理】
你若是 开了 DMA 按照数据块来处理,
那么 CPU 负荷要低 很多 ——
【一个字节时间是100uS 】
若是 数据块长度 100字节,
那么 处理周期 就是 100uS x 100 = 1万 uS

以 1万 uS 为周期,CPU 的负荷 周期就长很多。
回复

使用道具 举报

56

主题

520

帖子

0

精华

高级会员

Rank: 4

积分
964
金钱
964
注册时间
2014-11-18
在线时间
160 小时
发表于 2017-9-5 15:06:21 | 显示全部楼层
newbuff 发表于 2017-9-5 09:41
Rtos 能否给个思路,现在感觉是串口中断彼此打断,Rtos如何判断一帧数据接收完毕?

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

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

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

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


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

这个时间都有几ms了。

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

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

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





自己选择的路,成家前走完。
回复

使用道具 举报

1

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2011-12-1
在线时间
110 小时
发表于 2017-9-5 17:01:41 | 显示全部楼层
你这个你只要想着STM32作为绝对的主机就行了,就是通过指令控制你的从机什么时候发数据,什么时候不发数据,这样你把控好就可以的。如果主从很混淆的话,你这个就没法做,RTOS也不一定能做。
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2017-9-5 23:15:52 | 显示全部楼层
newbuff 发表于 2017-9-5 09:41
Rtos 能否给个思路,现在感觉是串口中断彼此打断,Rtos如何判断一帧数据接收完毕?

中断都有优先级的,加上dma处理,以串口的速率还是能应对的。像stm32的串口不带硬件fifo确实是个缺陷,nxp的就有,一分钱一分货吧。
回复

使用道具 举报

89

主题

579

帖子

0

精华

高级会员

Rank: 4

积分
859
金钱
859
注册时间
2014-9-30
在线时间
146 小时
发表于 2017-9-6 10:54:50 | 显示全部楼层
Acuity 发表于 2017-9-5 23:15
中断都有优先级的,加上dma处理,以串口的速率还是能应对的。像stm32的串口不带硬件fifo确实是个缺陷,nx ...

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

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

FIFO 的 深度x码元时间,仍然会丢数据。
回复

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2017-9-4
在线时间
6 小时
发表于 2017-9-6 10:58:13 | 显示全部楼层
接收数据的时候加一个延迟时间吧,每次接受完一个完整数据再进中断
回复

使用道具 举报

12

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2012-1-13
在线时间
29 小时
 楼主| 发表于 2017-9-6 10:59:14 | 显示全部楼层
aiyeba 发表于 2017-9-5 15:06
我觉得你误会了一个事情。就是说串口2的优先级更高。

你自己可以看看,我们在讲究时时性的时候就是要 ...

发送端是独立的,随时可能送来数据,所以两个发送间隔不仅有可能小于1ms,甚至有可能同时。当然大部分情况下都是间隔很久的,但是如何应对同时传输?
回复

使用道具 举报

12

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2012-1-13
在线时间
29 小时
 楼主| 发表于 2017-9-6 11:00:34 | 显示全部楼层
xlong_06 发表于 2017-9-5 17:01
你这个你只要想着STM32作为绝对的主机就行了,就是通过指令控制你的从机什么时候发数据,什么时候不发数据 ...

从机是传感器,满足条件就会传送数据过来。主机怎么可能去控制?
回复

使用道具 举报

17

主题

354

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2017-5-21
在线时间
340 小时
发表于 2017-9-6 16:11:54 来自手机 | 显示全部楼层
dma的串口接收数据即使cpu完全没有空也会接收并传到指定位置
回复

使用道具 举报

56

主题

520

帖子

0

精华

高级会员

Rank: 4

积分
964
金钱
964
注册时间
2014-11-18
在线时间
160 小时
发表于 2017-9-6 16:30:57 | 显示全部楼层
newbuff 发表于 2017-9-6 11:00
从机是传感器,满足条件就会传送数据过来。主机怎么可能去控制?

那这个就简单了,这种级别的数据丢失完全可以接收.

其实我觉得上操作系统也没用.真要较真还得上DMA.
自己选择的路,成家前走完。
回复

使用道具 举报

12

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2012-1-13
在线时间
29 小时
 楼主| 发表于 2017-9-6 21:54:33 | 显示全部楼层
aiyeba 发表于 2017-9-6 16:30
那这个就简单了,这种级别的数据丢失完全可以接收.

其实我觉得上操作系统也没用.真要较真还得上DMA.

实际应用中这个数据丢失是不可接受的。
我想了好久,觉得在使用串口方面,系统似乎并没有什么优势。
比如串口发送,就算有2个任务,分别有串口发送,如果一个正在发送一帧数据,另一个优先级高的抢占了打断了发送过程,没有好处。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-19 22:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表