OpenEdv-开源电子网

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

怎么解决多个串口并发数据排队错乱的问题?

[复制链接]

25

主题

180

帖子

0

精华

高级会员

Rank: 4

积分
596
金钱
596
注册时间
2015-1-14
在线时间
152 小时
发表于 2021-4-12 11:16:31 | 显示全部楼层 |阅读模式
10金钱
如题,STM32F103 使用串口1和2同时发送数据,怎么处理才能将数据做排队,应用场景:串口1、2同时有数据,怎么先接收完串口1,再接收串口2 的数据?

最佳答案

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

你这单片机作为主机是吧,从机收到指令会立即返回一帧数据是吧? 那只需处理好发送间隔就行了。 没程序的话我就不多说了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3389

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8646
金钱
8646
注册时间
2020-5-11
在线时间
4103 小时
发表于 2021-4-12 11:16:32 | 显示全部楼层
Mrjiang 发表于 2021-4-12 15:31
THK,不是说数据丢失,是数据排队的问题,这样子说吧,两段数据,data1,data2,app先往串口1先发送data1 ...

你这单片机作为主机是吧,从机收到指令会立即返回一帧数据是吧?
那只需处理好发送间隔就行了。
没程序的话我就不多说了。
专治疑难杂症
回复

使用道具 举报

6

主题

890

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1481
金钱
1481
注册时间
2020-8-19
在线时间
336 小时
发表于 2021-4-12 11:23:37 | 显示全部楼层
如果是发送数据,写个轮流发送的函数就可以啦,如果是接收,就是中断优先级,用中断服务函数
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13104
金钱
13104
注册时间
2012-11-26
在线时间
3811 小时
发表于 2021-4-12 11:26:10 | 显示全部楼层
你这想法很牛逼,要是串口1一直在收数据,串口2是不是就不要了?
回复

使用道具 举报

25

主题

180

帖子

0

精华

高级会员

Rank: 4

积分
596
金钱
596
注册时间
2015-1-14
在线时间
152 小时
 楼主| 发表于 2021-4-12 11:26:48 | 显示全部楼层
bin133 发表于 2021-4-12 11:23
如果是发送数据,写个轮流发送的函数就可以啦,如果是接收,就是中断优先级,用中断服务函数

肯定是用中断服务,现在就是如果1比2优先级高,同时又是1先有数据、2后有数据,这没有问题,但是如果是2先有数据,同时1又有数据到来的时候,1就会打断2,造成数据错乱,设想的是2先处理完,才去接收1的数据
回复

使用道具 举报

25

主题

180

帖子

0

精华

高级会员

Rank: 4

积分
596
金钱
596
注册时间
2015-1-14
在线时间
152 小时
 楼主| 发表于 2021-4-12 11:30:27 | 显示全部楼层
jermy_z 发表于 2021-4-12 11:26
你这想法很牛逼,要是串口1一直在收数据,串口2是不是就不要了?

你这想法也有点时髦,实际中有吗?1、2同时有数据完全存在,但是不存在一直有数据,对吧。比如WiFi、蓝牙,它是存在同时往单片机发送数据的
回复

使用道具 举报

25

主题

180

帖子

0

精华

高级会员

Rank: 4

积分
596
金钱
596
注册时间
2015-1-14
在线时间
152 小时
 楼主| 发表于 2021-4-12 11:35:34 | 显示全部楼层
jermy_z 发表于 2021-4-12 11:26
你这想法很牛逼,要是串口1一直在收数据,串口2是不是就不要了?

哪怕串口1一直有数据,也要等到它数据处理完,串口2才能接收数据,就是这么一个意思
回复

使用道具 举报

6

主题

890

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1481
金钱
1481
注册时间
2020-8-19
在线时间
336 小时
发表于 2021-4-12 11:58:26 | 显示全部楼层
Mrjiang 发表于 2021-4-12 11:26
肯定是用中断服务,现在就是如果1比2优先级高,同时又是1先有数据、2后有数据,这没有问题,但是如果是2 ...

设置抢占优先级一样,响应优先级为串口1优先
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13104
金钱
13104
注册时间
2012-11-26
在线时间
3811 小时
发表于 2021-4-12 12:55:31 | 显示全部楼层
Mrjiang 发表于 2021-4-12 11:30
你这想法也有点时髦,实际中有吗?1、2同时有数据完全存在,但是不存在一直有数据,对吧。比如WiFi、蓝牙 ...

就俩字  呵呵
学无止境
回复

使用道具 举报

12

主题

3389

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8646
金钱
8646
注册时间
2020-5-11
在线时间
4103 小时
发表于 2021-4-12 13:05:55 | 显示全部楼层
咋可能会乱,处理函数是同一个?
专治疑难杂症
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13104
金钱
13104
注册时间
2012-11-26
在线时间
3811 小时
发表于 2021-4-12 13:15:48 | 显示全部楼层
LcwSwust 发表于 2021-4-12 13:05
咋可能会乱,处理函数是同一个?

他都没想明白怎么做,就只是想串口1接收完再接收串口2,楼主作为15年就注册的老会员,都不知道该说啥
学无止境
回复

使用道具 举报

18

主题

151

帖子

0

精华

高级会员

Rank: 4

积分
508
金钱
508
注册时间
2020-4-22
在线时间
241 小时
发表于 2021-4-12 13:49:07 | 显示全部楼层
jermy_z 发表于 2021-4-12 13:15
他都没想明白怎么做,就只是想串口1接收完再接收串口2,楼主作为15年就注册的老会员,都不知道该说啥

数据流可能不是他决定的,我建议,要么DMA,要么就丢包呗,又不一定全要收到
回复

使用道具 举报

25

主题

180

帖子

0

精华

高级会员

Rank: 4

积分
596
金钱
596
注册时间
2015-1-14
在线时间
152 小时
 楼主| 发表于 2021-4-12 13:49:28 | 显示全部楼层

不知道就他妈别装逼,装啥呢,艹
回复

使用道具 举报

25

主题

180

帖子

0

精华

高级会员

Rank: 4

积分
596
金钱
596
注册时间
2015-1-14
在线时间
152 小时
 楼主| 发表于 2021-4-12 13:50:40 | 显示全部楼层
LcwSwust 发表于 2021-4-12 13:05
咋可能会乱,处理函数是同一个?

资源有限,用同一个buffer,才疏学浅啊,没办法,也不是专业的
回复

使用道具 举报

25

主题

180

帖子

0

精华

高级会员

Rank: 4

积分
596
金钱
596
注册时间
2015-1-14
在线时间
152 小时
 楼主| 发表于 2021-4-12 13:51:30 | 显示全部楼层
jermy_z 发表于 2021-4-12 13:15
他都没想明白怎么做,就只是想串口1接收完再接收串口2,楼主作为15年就注册的老会员,都不知道该说啥

知道了,指点下,会很感激,别他妈净说风凉话
回复

使用道具 举报

12

主题

3389

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8646
金钱
8646
注册时间
2020-5-11
在线时间
4103 小时
发表于 2021-4-12 14:03:21 | 显示全部楼层
本帖最后由 LcwSwust 于 2021-4-12 14:05 编辑
Mrjiang 发表于 2021-4-12 13:50
资源有限,用同一个buffer,才疏学浅啊,没办法,也不是专业的

程序弄上来看看,
简单点说弄两个buffer不就好了,但资源有限就要考虑下是不是要改下结构了。从原理上讲,两个串口是独立的,不会互相影响数据,所以jermy_z会觉得楼主的问题很奇怪,我也一样。
专治疑难杂症
回复

使用道具 举报

18

主题

151

帖子

0

精华

高级会员

Rank: 4

积分
508
金钱
508
注册时间
2020-4-22
在线时间
241 小时
发表于 2021-4-12 14:12:11 | 显示全部楼层
LcwSwust 发表于 2021-4-12 14:03
程序弄上来看看,
简单点说弄两个buffer不就好了,但资源有限就要考虑下是不是要改下结构了。从原理上讲 ...

大哥,你们单片机咋学的,就一个cpu,人家串口1串口2同时来数据了,不给DMA,那不得放弃一个串口的数据。
回复

使用道具 举报

12

主题

3389

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8646
金钱
8646
注册时间
2020-5-11
在线时间
4103 小时
发表于 2021-4-12 14:23:38 | 显示全部楼层
本帖最后由 LcwSwust 于 2021-4-12 14:41 编辑
moranyidui 发表于 2021-4-12 14:12
大哥,你们单片机咋学的,就一个cpu,人家串口1串口2同时来数据了,不给DMA,那不得放弃一个串口的数据。

我用STC的51单片机用的多,一个单片机处理3个串口的数据也是常事。
就算3个串口同时来数据(或同时产生接收中断)也是没问题的。
以波特率9600为例,9600波特率传输1字节需要约1ms,单片机进入串口中断并将此处据存入buffer
假设需要10us,那么CPU占用约1%,处理3个串口绰绰有余。
我是这样想的,串口接收其实有两个寄存器,一个是移位寄存器R1,一个缓冲寄存器R2,
收到启始位后,每个104us左右对数据线采样让R1移位1次,8次后(或第9次停止位时)将R1的数据存入R2并产生中断,
所以只要在下一字节未接收到停止位时,这个R2都不会被覆盖,不会造成数据丢失,这个时间大约有1ms。STC手册中的图:
傲游截图20210412143259.jpg 傲游截图20210412143647.jpg
STM32的手册中的说明,可以参考一下:
傲游截图20210412144014.jpg




专治疑难杂症
回复

使用道具 举报

12

主题

3389

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8646
金钱
8646
注册时间
2020-5-11
在线时间
4103 小时
发表于 2021-4-12 14:58:04 | 显示全部楼层
jermy_z 发表于 2021-4-12 13:15
他都没想明白怎么做,就只是想串口1接收完再接收串口2,楼主作为15年就注册的老会员,都不知道该说啥

看到这标题我也挺震惊的,消消气,重在交流学习。
楼主也应虚心请教,把问题早点说清楚。
专治疑难杂症
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13104
金钱
13104
注册时间
2012-11-26
在线时间
3811 小时
发表于 2021-4-12 15:10:25 | 显示全部楼层
Mrjiang 发表于 2021-4-12 13:51
知道了,指点下,会很感激,别他妈净说风凉话

跟个傻逼一样
学无止境
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13104
金钱
13104
注册时间
2012-11-26
在线时间
3811 小时
发表于 2021-4-12 15:10:58 | 显示全部楼层
Mrjiang 发表于 2021-4-12 13:49
不知道就他妈别装逼,装啥呢,艹

15年注册,这都5年了,还跟个傻逼一样,放弃吧
学无止境
回复

使用道具 举报

25

主题

180

帖子

0

精华

高级会员

Rank: 4

积分
596
金钱
596
注册时间
2015-1-14
在线时间
152 小时
 楼主| 发表于 2021-4-12 15:25:13 | 显示全部楼层
jermy_z 发表于 2021-4-12 15:10
15年注册,这都5年了,还跟个傻逼一样,放弃吧

哦哦,送你一首歌,你好牛逼。。。,真他妈以为自己是谁,老子又没说我是做技术的,你牛啥呢?傻逼,你他妈不想说就他妈别逼逼
回复

使用道具 举报

25

主题

180

帖子

0

精华

高级会员

Rank: 4

积分
596
金钱
596
注册时间
2015-1-14
在线时间
152 小时
 楼主| 发表于 2021-4-12 15:25:57 | 显示全部楼层

知道傻逼长啥样吗?去撒泡尿照照你就清楚了
回复

使用道具 举报

25

主题

180

帖子

0

精华

高级会员

Rank: 4

积分
596
金钱
596
注册时间
2015-1-14
在线时间
152 小时
 楼主| 发表于 2021-4-12 15:31:08 | 显示全部楼层
本帖最后由 Mrjiang 于 2021-4-12 15:35 编辑
LcwSwust 发表于 2021-4-12 14:23
我用STC的51单片机用的多,一个单片机处理3个串口的数据也是常事。
就算3个串口同时来数据(或同时产生 ...

THK,不是说数据丢失,是数据排队的问题,这样子说吧,两段数据,data1,data2,app先往串口1先发送data1,串口数据还没有接收完,另一个app就往串口2发送data2了,恰好,串口2的优先级要比串口1高,所以就会在串口1接收的数据data1里面掺杂串口2 的数据data2,理想的是,串口1处理完了data1,在处理串口2 的,两个共用一个buffer
回复

使用道具 举报

25

主题

180

帖子

0

精华

高级会员

Rank: 4

积分
596
金钱
596
注册时间
2015-1-14
在线时间
152 小时
 楼主| 发表于 2021-4-12 15:33:12 | 显示全部楼层
jermy_z 发表于 2021-4-12 15:10
15年注册,这都5年了,还跟个傻逼一样,放弃吧

看了下他主页,这玩意儿就一愤青,天天嗷嗷叫,逮谁咬谁
回复

使用道具 举报

25

主题

180

帖子

0

精华

高级会员

Rank: 4

积分
596
金钱
596
注册时间
2015-1-14
在线时间
152 小时
 楼主| 发表于 2021-4-12 15:36:41 | 显示全部楼层
LcwSwust 发表于 2021-4-12 14:23
我用STC的51单片机用的多,一个单片机处理3个串口的数据也是常事。
就算3个串口同时来数据(或同时产生 ...

主要是共用buffer不好处理,分开用独立buffer就好弄
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13104
金钱
13104
注册时间
2012-11-26
在线时间
3811 小时
发表于 2021-4-12 15:41:12 | 显示全部楼层
Mrjiang 发表于 2021-4-12 15:25
知道傻逼长啥样吗?去撒泡尿照照你就清楚了

傻逼   别再回复了   放弃吧
学无止境
回复

使用道具 举报

25

主题

180

帖子

0

精华

高级会员

Rank: 4

积分
596
金钱
596
注册时间
2015-1-14
在线时间
152 小时
 楼主| 发表于 2021-4-12 15:49:31 | 显示全部楼层
jermy_z 发表于 2021-4-12 15:41
傻逼   别再回复了   放弃吧

人和头像差不多,就一傻狗,而且还是傻逼的狗,干了10多年,也不见你干出个啥来,傻狗。拜拜您勒,傻狗,别来我这个帖子了
回复

使用道具 举报

25

主题

180

帖子

0

精华

高级会员

Rank: 4

积分
596
金钱
596
注册时间
2015-1-14
在线时间
152 小时
 楼主| 发表于 2021-4-12 15:52:33 | 显示全部楼层
jermy_z 发表于 2021-4-12 15:41
傻逼   别再回复了   放弃吧

你来这个帖子了,感觉空气都是一股狗尿味
回复

使用道具 举报

25

主题

180

帖子

0

精华

高级会员

Rank: 4

积分
596
金钱
596
注册时间
2015-1-14
在线时间
152 小时
 楼主| 发表于 2021-4-12 16:00:51 | 显示全部楼层
LcwSwust 发表于 2021-4-12 15:54
你这单片机作为主机是吧,从机收到指令会立即返回一帧数据是吧?
那只需处理好发送间隔就行了。
没程序 ...

好的,很感谢你,单片机只是接收数据,串口分别用于蓝牙、wifi、或是4G模块通信,然后上位机可能会同时发送数据,不做排队的话,可能每个app发送的数据会有错乱,也就是我说的并发排队问题
回复

使用道具 举报

12

主题

3389

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8646
金钱
8646
注册时间
2020-5-11
在线时间
4103 小时
发表于 2021-4-12 16:07:24 | 显示全部楼层
Mrjiang 发表于 2021-4-12 16:00
好的,很感谢你,单片机只是接收数据,串口分别用于蓝牙、wifi、或是4G模块通信,然后上位机可能会同时发 ...

嗯,两个串口同时收到数据,却又要用同一个buffer,的确很为难。
两个建议:
1.将这种“时分复用”的思想用在别处,比如发送数据,这里接收数据还是要分开。
2.处理接收数据不一定要buffer,还可以用状态机,有点像“以时间换空间”的思想。

专治疑难杂症
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3879
金钱
3879
注册时间
2017-3-7
在线时间
1692 小时
发表于 2021-4-12 16:44:30 | 显示全部楼层
现在芯片ram一般都够用吧,没必要两个通信共用一个buffer这么省,当然真的这样的话,同时来数据的话确实存在混杂的情况,只能使用状态机类似的机制来舍弃一些数据了
回复

使用道具 举报

18

主题

151

帖子

0

精华

高级会员

Rank: 4

积分
508
金钱
508
注册时间
2020-4-22
在线时间
241 小时
发表于 2021-4-12 17:34:08 | 显示全部楼层
LcwSwust 发表于 2021-4-12 14:23
我用STC的51单片机用的多,一个单片机处理3个串口的数据也是常事。
就算3个串口同时来数据(或同时产生 ...

的确,中断处理程序足够短,好像也可以,
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 21:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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