OpenEdv-开源电子网

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

STM32一个串口与多设备通信

[复制链接]

32

主题

286

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2014-3-27
在线时间
358 小时
发表于 2016-5-9 15:08:24 | 显示全部楼层 |阅读模式
5金钱
目前一个项目,用到4个模块,4个模块本身都是串口数据输出,而问题是STM32只有一个串口空闲了。
在网上看到有说,用MODBUS协议可以解决,以前用过MODBUS,是一个主机 控制10个从机,用的485通信。
重点是,那10个从机本身是可以独立工作的,有专门的485电路,可以烧录代码,地址可以自己配置。在我的
理解中,那样的MODBUS通信才是完整的。
而现在,我想直接把这4个模块焊接在一个主板上,直接与STM32某个串口相连,没有232或485. 相当于4个模块共用一个串口,


不知道各位大神有没有解决办法,恳请分享,谢谢。

最佳答案

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

关注一下这个问题,按照6楼所说的,这样做的话,并不知道切换的时间点。 想了一下,看看可不可以这样,让这个串口扩展芯片进行一个速度很快的轮询(我没用过类似的芯片,不知道速度怎么样)。首次上电传输,一旦某个串口接收到数据,就不要继续轮询(即把其他的任务阻塞住),把这串数据接收完,然后继续轮询(比如由串口1切换到串口2),那么就会出现这种情况,串口2这时候数据只发送了一半,单片机接收的很有可能是串口2的 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2016-5-9 15:08:25 | 显示全部楼层
本帖最后由 东北小辉辉 于 2016-5-9 22:36 编辑
wjfhsym 发表于 2016-5-9 16:10
那个串口扩展芯片 WK2114   ,   每个UART通道都可以独立设置开或关,那我就想  开通道1时,另外3个通道都 ...

关注一下这个问题,按照6楼所说的,这样做的话,并不知道切换的时间点。

想了一下,看看可不可以这样,让这个串口扩展芯片进行一个速度很快的轮询(我没用过类似的芯片,不知道速度怎么样)。首次上电传输,一旦某个串口接收到数据,就不要继续轮询(即把其他的任务阻塞住),把这串数据接收完,然后继续轮询(比如由串口1切换到串口2),那么就会出现这种情况,串口2这时候数据只发送了一半,单片机接收的很有可能是串口2的一半的数据,这里想办法在程序里进行一个校验,举个例子,如果楼主所说的“几十个字节是一个基本确定的值”,那么就可以从长度来进行校验,小于这个字节数就算接收错误,给串口较高的波特率,几十个字节的接收时间就会很短,以楼主一秒的频率接收数据的话,出现上述错误的几率应该不会很高。不知道楼主对数据的实时性要求如何,以上只是我一个幼稚的想法,借鉴了操作系统的任务调度的思想,希望大家来讨论一下。



半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

70

主题

6766

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13146
金钱
13146
注册时间
2012-11-26
在线时间
3816 小时
发表于 2016-5-9 15:25:22 | 显示全部楼层
你的模块会同时工作吗?即可能同时向STM32发送数据吗?   如果有可能同时工作,我的看法是无解,如果是作为从机使用,直接串起来用,问题不大,具体有无副作用,要看具体架构
回复

使用道具 举报

32

主题

286

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2014-3-27
在线时间
358 小时
 楼主| 发表于 2016-5-9 15:42:32 | 显示全部楼层
会的,那几个模块上电后都会发数据,1S发一次,一次几十字节数据,问题是我没法控制那些模块,所以数据接收可能会乱掉。
不过我在网上看到有些解决方案,就是使用串口扩展芯片,比如有1扩4的芯片,每个串口通道可以单独开通或关闭。看着好像还行,准备试试。
回复

使用道具 举报

70

主题

6766

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13146
金钱
13146
注册时间
2012-11-26
在线时间
3816 小时
发表于 2016-5-9 15:49:01 | 显示全部楼层
wjfhsym 发表于 2016-5-9 15:42
会的,那几个模块上电后都会发数据,1S发一次,一次几十字节数据,问题是我没法控制那些模块,所以数据接收 ...

没用过

不过看着也不是能解决这个问题

毕竟你的模块会自己往主机发数据,一起发的话。。。
学无止境
回复

使用道具 举报

32

主题

286

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2014-3-27
在线时间
358 小时
 楼主| 发表于 2016-5-9 16:10:14 | 显示全部楼层
那个串口扩展芯片 WK2114   ,   每个UART通道都可以独立设置开或关,那我就想  开通道1时,另外3个通道都关闭,开通道2时,其它也关闭,依次进行。应该可行吧。
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11569
金钱
11569
注册时间
2014-4-1
在线时间
1320 小时
发表于 2016-5-9 16:36:38 | 显示全部楼层

如何知道切换的时间点?
这需要一整套解决方案。


回复

使用道具 举报

头像被屏蔽

88

主题

231

帖子

2

精华

高级会员

Rank: 4

积分
844
金钱
844
注册时间
2013-4-11
在线时间
40 小时
发表于 2016-5-9 17:17:32 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

32

主题

286

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2014-3-27
在线时间
358 小时
 楼主| 发表于 2016-5-10 14:12:54 | 显示全部楼层
xuande 发表于 2016-5-9 16:36
如何知道切换的时间点?
这需要一整套解决方案。

这个我也考虑了,因为几个串口设备是同类型的,都是1S发送一次,区别就是每个设备 数据头不同,而总数据长度相同,我打算把每个通道的开启时间设置 为2S,或者3S。  保证这个通道能接收完成,这2-3秒内,通道1打开,其它通道关闭。依次进行,这样的话,通道1可能会接收2次或3次,我打算舍弃多余的,只保留一帧数据。
回复

使用道具 举报

32

主题

286

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2014-3-27
在线时间
358 小时
 楼主| 发表于 2016-5-10 14:15:47 | 显示全部楼层
东北小辉辉 发表于 2016-5-9 22:00
关注一下这个问题,按照6楼所说的,这样做的话,并不知道切换的时间点。

想了一下,看看可不可以这样 ...

你的思想很好,你提到的实时性的问题,我不会严格到每一秒,数据总时间可能5S,10S,都可以的。我也考虑了,因为几个串口设备是同类型的,都是1S发送一次,区别就是每个设备 数据头不同,而总数据长度相同,我打算把每个通道的开启时间设置 为2S,或者3S。  保证这个通道能接收完成,这2-3秒内,通道1打开,其它通道关闭。依次进行,这样的话,通道1可能会接收2次或3次,我打算舍弃多余的,只保留一帧数据。
回复

使用道具 举报

3

主题

104

帖子

0

精华

高级会员

Rank: 4

积分
986
金钱
986
注册时间
2012-5-8
在线时间
350 小时
发表于 2016-5-10 14:29:01 | 显示全部楼层
用max3100  MAX3100通用异步收发器是第一个专门用于小型单片机系统,可以通过SPI接口和微控制器通信。MAX3100可以用于RS232、RS485以及红外线的串口
回复

使用道具 举报

70

主题

6766

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13146
金钱
13146
注册时间
2012-11-26
在线时间
3816 小时
发表于 2016-5-10 14:29:10 | 显示全部楼层
wjfhsym 发表于 2016-5-10 14:15
你的思想很好,你提到的实时性的问题,我不会严格到每一秒,数据总时间可能5S,10S,都可以的。我也考虑 ...

你时间分配不合理的话,一个通道也收不到。。。
学无止境
回复

使用道具 举报

32

主题

286

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2014-3-27
在线时间
358 小时
 楼主| 发表于 2016-5-10 15:17:06 | 显示全部楼层
jermy_z 发表于 2016-5-10 14:29
你时间分配不合理的话,一个通道也收不到。。。

我在想先不管时间怎么分配,首先已经明白的事情  是串口设备都是1秒发送一帧数据,数据头不同,长度一样。那如果先打开通道1,关闭其它3个通道,我在串口中断中判断 设备1(通道1)的数据头,如果正常,往下进行,接收完总长度的数据,再校验看是否正确。 如果不对,重新接收。 如果正常,这一组数据保存起来。 再依次打开 2,3,4通道,并关闭相应的通道,总之只让一个通道打开,并直到接收成功,再往下进行。这样肯定没问题
回复

使用道具 举报

32

主题

286

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2014-3-27
在线时间
358 小时
 楼主| 发表于 2016-5-10 15:18:11 | 显示全部楼层
xuande 发表于 2016-5-9 16:36
如何知道切换的时间点?
这需要一整套解决方案。

串口设备都是1秒发送一帧数据,数据头不同,长度一样。那如果先打开通道1,关闭其它3个通道,我在串口中断中判断 设备1(通道1)的数据头,如果正常,往下进行,接收完总长度的数据,再校验看是否正确。 如果不对,重新接收。 如果正常,这一组数据保存起来。 再依次打开 2,3,4通道,并关闭相应的通道,总之只让一个通道打开,并直到接收成功,再往下进行。这样肯定没问题
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11569
金钱
11569
注册时间
2014-4-1
在线时间
1320 小时
发表于 2016-5-10 15:22:47 | 显示全部楼层
wjfhsym 发表于 2016-5-10 15:18
串口设备都是1秒发送一帧数据,数据头不同,长度一样。那如果先打开通道1,关闭其它3个通道,我在串口中 ...


这样可行,反正数据率不高。
注意物理上的切换。


回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-5-10 15:30:18 | 显示全部楼层
对实时性要求不是特别高的情况下,用数据选择器,74H151这种片子,一次只选择一路数据输入,收到数据或是超时以后切换下一个通道
回复

使用道具 举报

32

主题

286

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2014-3-27
在线时间
358 小时
 楼主| 发表于 2016-5-10 15:34:22 | 显示全部楼层
xuande 发表于 2016-5-10 15:22
这样可行,反正数据率不高。
注意物理上的切换。

恩,那个WK2114说的是可软件控制通道独立工作,所以应该是没问题的。
回复

使用道具 举报

32

主题

286

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2014-3-27
在线时间
358 小时
 楼主| 发表于 2016-5-10 15:40:08 | 显示全部楼层
ricefat 发表于 2016-5-10 15:30
对实时性要求不是特别高的情况下,用数据选择器,74H151这种片子,一次只选择一路数据输入,收到数据或是超 ...

应该也是可以,虽然是串口设备,但(对MCU而言)毕竟只有数据接收一项,而不需要发数据给设备。所以一根线用于接收也没问题。4路数据输入端接到串口设备的发送端应该可行。前提是实时性要求不高。
回复

使用道具 举报

70

主题

6766

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13146
金钱
13146
注册时间
2012-11-26
在线时间
3816 小时
发表于 2016-5-10 15:57:14 | 显示全部楼层
wjfhsym 发表于 2016-5-10 15:17
我在想先不管时间怎么分配,首先已经明白的事情  是串口设备都是1秒发送一帧数据,数据头不同,长度一样 ...

也可以
学无止境
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11569
金钱
11569
注册时间
2014-4-1
在线时间
1320 小时
发表于 2016-5-10 16:15:53 | 显示全部楼层
本帖最后由 xuande 于 2016-5-10 16:17 编辑


软件要完善,还是很麻烦的。
估计每个模块上电的时间点都有差别,
主机串口刚打开,可能就产生错误了。

好在数据间隙比较大,可以作为一下。


回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-9 07:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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