标题: 关于单片机多机通讯解决方案建议 [打印本页]

作者: xuchun    时间: 2021-9-26 18:09
标题: 关于单片机多机通讯解决方案建议
1、用STC8H单片机
2、一个主设备N个从设备(采用软件分配地址-首次分配-增加从设备分配-根据距离长短从小到大分配)
3、通讯方式,485或者其他不易分析的通讯方式
4、地址码,控制码,数据,数据,数据,数据长度,校验位



考虑用Modbus 不知道有没有更好的建议。  
作者: wfqxgw    时间: 2021-9-26 19:03
还没研究过。不过目前我也在做一种多机级联的项目。用的是通用串口方式。在试用中。
作者: xuchun    时间: 2021-9-26 19:06
一般单片机地址都是采用拨码方式设定,现在考虑成本 想用软件 根据唯一ID 赋值地址 再根据距离让从机从小到大获取地址。
作者: wfqxgw    时间: 2021-9-26 20:11
我这个是通过串口传输,但是采用的是应答方式来处理主,从关系。并自动软件分配ID,获得主机权限有两种方式。第一个开机的设备为主机,或者通过按键手动设置。
作者: xuchun    时间: 2021-9-26 20:14
wfqxgw 发表于 2021-9-26 20:11
我这个是通过串口传输,但是采用的是应答方式来处理主,从关系。并自动软件分配ID,获得主机权限有两种方式 ...

你说的我们项目实际情况不容许,我们设备不可能固定谁第一个开机,也不好从机固定不变。所以想这如何根据唯一ID 查编码 再根据返回ID的先后顺序固定ID。感谢您的回复
作者: 188610329    时间: 2021-9-26 22:03
xuchun 发表于 2021-9-26 20:14
你说的我们项目实际情况不容许,我们设备不可能固定谁第一个开机,也不好从机固定不变。所以想这如何根据 ...

串口多机通信,本来就是依靠不同的地址,来区分哪台机,你既不让从机地址固定,又要区分各从机,感觉上,只能用一个变通的方法。

确保,从机不同一时间一起开机。
主机,定期呼叫某一特定编号从机。比如 0xee (纯粹举例子)
从机,开机默认 0xee,等待主机分配新地址
主机给这台新从机分配一个新的地址,并登记到已开机列表。
从机,重新登记主机分配的地址为新地址,并且亮一个指示灯。

开下一台从机,重复上面步骤。直到所有从机被分配地址

按你的需求好像只能这样变通实行。

当然,还有一个模仿对码的方案,就是从机按一个按键,就进入对码状态,给自己分配对码频道 0xee 等待主机分配新地址。
主机按一个钮,进入对码状态,查找 0xee从机,给他分配新地址。
也是一个方案。


作者: xuchun    时间: 2021-9-26 22:17
188610329 发表于 2021-9-26 22:03
串口多机通信,本来就是依靠不同的地址,来区分哪台机,你既不让从机地址固定,又要区分各从机,感觉上, ...

感谢您的回复,可能我的表述有问题,需求是:从设备依次从近至远安装到指定位置,系统运行主设备寻找发现从设备,询问发现的从设备数量是否与实际安装的设备数量一致,如果一致系统开始分配地址,从机最近  -先获取到数据  取最小数地址!但是考虑后期从设备可能更换或者增加,所以不知道大家都是如何处理的。
作者: 188610329    时间: 2021-9-26 22:34
xuchun 发表于 2021-9-26 22:17
感谢您的回复,可能我的表述有问题,需求是:从设备依次从近至远安装到指定位置,系统运行主设备寻找发现 ...

你这个只能从非标通信角度去考虑了。

比如环状串口模式,即,主机 TX =>  一号机 RX,  一号机 TX => 二号机 RX  ……………… , N号机 TX => 主机RX

那么,主机发送    “开始设置”    一号机收到, 给自己标记  1号机,然后发送  “你是2号机”, …………………… N号机收到 后  给自己标注 N号机, 并发送 你是 “N + 1 号机”  , 主机收到后, 标记,总共 N 号机。

通信时, 主机发送:  X 号机 做 ABC       然后每个从机接力,收到后判断自己是不是 X 号机,不是的话继续传下去,是的话, 就做 ABC   做完后, 发送: X号机说: CDE    然后,再一圈接力。直到主机收到 后 记录。

作者: xuchun    时间: 2021-9-26 22:43
188610329 发表于 2021-9-26 22:34
你这个只能从非标通信角度去考虑了。

比如环状串口模式,即,主机 TX =>  一号机 RX,  一号机 TX =>  ...

感谢,我是想先根据ID判断有多少从机 然后丢多少地址出去 让先收到从机自己捡最小的拿走!主机发功能码时候直接带地址 丢出去 是谁的自己判断 然后干活。
作者: 188610329    时间: 2021-9-26 22:59
xuchun 发表于 2021-9-26 22:43
感谢,我是想先根据ID判断有多少从机 然后丢多少地址出去 让先收到从机自己捡最小的拿走!主机发功能码时 ...

我知道你的意思,但是,带地址多从机串口通讯(其实就是并联) 在从机没有分配地址前,所有从机都为收到相同的内容,又会同时发送信息,这是无法调节的矛盾,要么,你手动每个从机设置好地址,要么就是我说的建立一个对码“频道”,要么,就只能环状通信这一条路,
当然,还有一个办法,就是搭建一个串行路由器,所有通讯通过这个串行路由来分配。不过,这个成本,还不如上网络模块了。通过以太网方式通讯就不存在这个问题了。

当然,如果你主机IO多,通过,不同的IO,下拉不同从机的 指定IO 告诉从机,这是我和你私密通讯,也是一个方法。这就类似 SPI 的一主多从模式,通过不同的 SS 线控制,SPI的的片选。
作者: xuchun    时间: 2021-9-26 23:04
188610329 发表于 2021-9-26 22:59
我知道你的意思,但是,带地址多从机串口通讯(其实就是并联) 在从机没有分配地址前,所有从机都为收到 ...

好的,感谢您。我再考虑考虑
作者: dzbj    时间: 2021-9-27 02:00
xuchun 发表于 2021-9-26 22:17
感谢您的回复,可能我的表述有问题,需求是:从设备依次从近至远安装到指定位置,系统运行主设备寻找发现 ...

其他都不是问题 就是要求距离确定先后没想出怎么弄
作者: 风158    时间: 2021-9-27 07:38
试试提前写入地址,用I2C通讯。缺点是速率较低。
作者: ly1972001    时间: 2021-9-27 08:05
要按距离来,就只能手拉手了。远的从机把离主机近的上一个从机作为主机。
作者: baonng    时间: 2021-9-27 09:21
多机通讯的话,也可以考虑下CAN总线通讯。
作者: ly1972001    时间: 2021-9-27 10:04
baonng 发表于 2021-9-27 09:21
多机通讯的话,也可以考虑下CAN总线通讯。

楼主要求无地址。
作者: yzwzfyz    时间: 2021-9-27 11:06
说白了,就是个通讯协议!
通用的格式是:
起始标记、字节数、源机号、的机号、命令号、数据[N]、校验码、结束标记。
这样比较全。可根据具体情况删除一些,如楼主条件是1拖N。由于1是固定的,所以源机号可省。
通过字节数据可以计算出结束标记的位置,结束标记可省。不省也有不省的好处。谁写程序谁清楚。
作者: shumivan    时间: 2021-9-29 13:40
当然你也可以选择CAN总线,速度又快,也有自己的仲裁机制。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1