搜索
bottom↓
回复: 35

USART总线通信如何自动给子设备分配地址

[复制链接]

出0入0汤圆

发表于 2016-8-29 16:07:35 | 显示全部楼层 |阅读模式
使用USART转232通讯,一主多从,主机如何给子设备自动分配地址?软件怎么设计,请大家给点思路

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入4汤圆

发表于 2016-8-29 16:19:49 | 显示全部楼层
232 不支持多从机,要用总线类型的422 485

出0入0汤圆

发表于 2016-8-29 16:22:23 | 显示全部楼层
acmilannast 发表于 2016-8-29 16:19
232 不支持多从机,要用总线类型的422 485

要那样搞也是可以的……

出0入0汤圆

发表于 2016-8-29 16:23:12 | 显示全部楼层
本帖最后由 liwey 于 2016-8-29 16:27 编辑

用序列号。

1,即每台设备都有一个出厂序列号:比如 000001,000002,000003.等等

2,上位机由用户填入设备序列号;

3,上位机使用序列号来轮询设备,如果设备存在,则分配地址(可以按顺序分配),第一个序列号分配01,第一个序列号分配02.

4, 使用上述地址来进行其它通讯

出0入0汤圆

 楼主| 发表于 2016-8-29 16:24:30 | 显示全部楼层
改接口倒是简单,倒是分配ID的问题不好解决

出0入8汤圆

发表于 2016-8-29 16:24:39 | 显示全部楼层
个人瞎想:
1.每个从机自动默认设定一个随机地址;
2.主机广播查询,从机随机定时发送各自地址响应;
3.主机重新设定各从机地址。

出0入0汤圆

 楼主| 发表于 2016-8-29 16:26:34 | 显示全部楼层
bujie8010 发表于 2016-8-29 16:24
个人瞎想:1.每个从机自动默认设定一个随机地址,主机广播查询,从机随机定时发送各自地址响应,主机设定各 ...

这个随机地址是由什么产生的,时钟?如果多设备同时上电,产生的时钟几乎是同步的所以我比较挠头

出0入8汤圆

发表于 2016-8-29 16:29:16 | 显示全部楼层
用int rand(void)函数!

出0入0汤圆

发表于 2016-8-29 16:31:11 | 显示全部楼层
陶新成 发表于 2016-8-29 16:26
这个随机地址是由什么产生的,时钟?如果多设备同时上电,产生的时钟几乎是同步的所以我比较挠头 ...

我4楼的方案不行吗?我就是这么搞的,动态分配地址的

出0入0汤圆

发表于 2016-8-29 16:32:24 | 显示全部楼层
有唯一ID就很方便。如果没有,不好做。

①最简单的办法:生成的BIN文件里面自带唯一地址(绝对定位这个地址数据,生成的BIN再用专门的程序处理一下)。后面你要类似 ARP之类的地址重映射也可以。
对于识别总线上有多少个设备,最简单的是 主机枚举地址,从机匹配了就响应。不要挂太多设备,否则识别时间很长。

②做类似CAN那样的总线占用检测和竞争协议,防止多个从机枚举自己的时候冲突

出0入0汤圆

发表于 2016-8-29 16:34:19 | 显示全部楼层
xivisi 发表于 2016-8-29 16:32
有唯一ID就很方便。如果没有,不好做。

①最简单的办法:生成的BIN文件里面自带唯一地址(绝对定位这个地 ...

一般楼宇的门禁就是用的我说的那种方案

出0入0汤圆

 楼主| 发表于 2016-8-29 16:35:40 | 显示全部楼层
bujie8010 发表于 2016-8-29 16:29
用int rand(void)函数!

我没用过这个函数,每个处理器同时调用rand函数产生的相同随机数的概率不会很大吧,如果不大那的确是个好主意

出0入0汤圆

 楼主| 发表于 2016-8-29 16:36:15 | 显示全部楼层
liwey 发表于 2016-8-29 16:34
一般楼宇的门禁就是用的我说的那种方案

我用的AVR单片机,不知道能不能读

出0入0汤圆

发表于 2016-8-29 16:36:24 | 显示全部楼层
liwey 发表于 2016-8-29 16:34
一般楼宇的门禁就是用的我说的那种方案

晕,我发帖了完,才发现有同样的方案

出0入0汤圆

发表于 2016-8-29 16:37:12 | 显示全部楼层
陶新成 发表于 2016-8-29 16:36
我用的AVR单片机,不知道能不能读

能不能读是什么意思?

出0入0汤圆

 楼主| 发表于 2016-8-29 16:37:29 | 显示全部楼层
xivisi 发表于 2016-8-29 16:32
有唯一ID就很方便。如果没有,不好做。

①最简单的办法:生成的BIN文件里面自带唯一地址(绝对定位这个地 ...

这个文件不知道怎么读取,如果做CAN协议太占用MCU资源吧

出0入0汤圆

发表于 2016-8-29 16:38:17 | 显示全部楼层
别无他法 。 只能四楼方法。
使用唯一序列号。  工作后查询各个序列号。 然后重新编号排序。
随机函数不准确。

出0入0汤圆

发表于 2016-8-29 16:38:36 | 显示全部楼层
陶新成 发表于 2016-8-29 16:35
我没用过这个函数,每个处理器同时调用rand函数产生的相同随机数的概率不会很大吧,如果不大那的确是个好 ...

随机数函数不靠谱,绝对会产生相同地址的可能,如果出现了对你的通信没啥影响无所谓。

出0入0汤圆

发表于 2016-8-29 16:43:08 | 显示全部楼层
本帖最后由 xivisi 于 2016-8-29 16:46 编辑
陶新成 发表于 2016-8-29 16:37
这个文件不知道怎么读取,如果做CAN协议太占用MCU资源吧


不是真做CAN协议

简单的一个方案。 232电平转换芯片会产生负压和正压, 某个设备要通信,先侦听上面有没有数据。没有就用三极管拉到正电压,对总线上的设备通告自己要通信,然后发送侦听码(每个设备唯一的),无误则继续通信。 其他逻辑,类似所有半双工通信。

PS:拉到正压貌似不怎么行,拉到负压倒是很容易。改成发送0xAA之类的信号来通告吧。

出0入0汤圆

发表于 2016-8-29 20:55:42 来自手机 | 显示全部楼层
lin 楼主看看

出0入42汤圆

发表于 2016-8-29 22:28:15 来自手机 | 显示全部楼层
再补充一种方案,无序列号时。每个子设备工装上接一个继电器,上位机开通对应的接口后,再改地址。

出0入8汤圆

发表于 2016-8-29 22:44:45 | 显示全部楼层
从机用唯一序列号计算出一个值,全部都发到总线上,没有冲突的话就用这个值作为地址

出145入215汤圆

发表于 2016-8-30 09:31:31 来自手机 | 显示全部楼层
用拨码开关设置从机地址,从机每次通电从机检测一次自己的地址,如果发生变化就把自己的地址在空闲时候发送出去进行注册。如果主机访问从机多次无回应则判断从机故障报警后移除注册。释放地址

出0入0汤圆

发表于 2016-8-30 09:55:38 | 显示全部楼层
不知道楼主听过一个东西没,DALI,是一个灯控的系统,他就是动态分配地址的,而且可以重新编排。

原理大概是用白噪声产生一个随机数据,然后主机通过访问来获取,得到后再分配一个通讯地址,效率挺高的,具体细节得楼主自己去查了。

出0入0汤圆

发表于 2016-8-30 11:04:03 | 显示全部楼层
一心2013 发表于 2016-8-30 09:55
不知道楼主听过一个东西没,DALI,是一个灯控的系统,他就是动态分配地址的,而且可以重新编排。

原理大概 ...

数字可寻址照明接口

出20入12汤圆

发表于 2016-8-30 11:06:51 | 显示全部楼层
陶新成 发表于 2016-8-29 16:35
我没用过这个函数,每个处理器同时调用rand函数产生的相同随机数的概率不会很大吧,如果不大那的确是个好 ...

曾经用过后,调试时会发现运行后每次reset打断点数据会很熟悉

出0入0汤圆

发表于 2016-8-30 11:52:54 | 显示全部楼层
朋友的产品,量产的,供参考

设备在生产的时候,系统自动把首次上电的时间(精确到毫秒)乘以一个质数,取其中的16bit,作为设备ID

主机上电后广播,设备回复ID。 作为后备手段,设备ID可以通过主机发命令修改

出0入0汤圆

发表于 2016-8-30 12:36:52 | 显示全部楼层
DS18B20,你的不二选择,好用又实惠。

出0入36汤圆

发表于 2016-8-30 12:42:28 | 显示全部楼层
上面说的都不靠谱 要是一条总线有多个设备 主机广播查询没问题 多主机同时回复会怎么样?没人知道后果,也就是说这种方式根本不合适自动发现新设备后分配地址。只有像四楼那样使用唯一序列号然后手动输入后才行,当然这样其实没有一点意义,已经有唯一序列号了还要重新分配个地址不是脱裤子放屁的事情么。

出0入0汤圆

发表于 2016-8-30 14:26:02 | 显示全部楼层
norman33 发表于 2016-8-30 12:42
上面说的都不靠谱 要是一条总线有多个设备 主机广播查询没问题 多主机同时回复会怎么样?没人知道后果,也 ...

其实这个不是问题的,多从机同时回复,会造成总线数据错乱,到主机这边的现象就是应答数据校验不正确或无效应答,重试几次都是这样之后,主机就可以判定此地址无效,可以广播一个命令让所有使用此地址的从机重新生成地址,同时附带一个当前已使用的地址表,然后从机重新用随机数生成一个地址就行了,可以不断重复这个过程直到所有从机地址有效。对于只有二三十个从机的网络,实测地址确定过程不超过10秒

出0入0汤圆

发表于 2016-8-30 17:18:43 | 显示全部楼层
用指拨开关,每个从机拨不同的位置,从机的底层上电后读IO的状态即地址,通讯协议上增加地址帧,软件判断地址,广播地址和与从机地址对应的从机应答

出0入36汤圆

发表于 2016-8-31 09:33:49 | 显示全部楼层
菜包 发表于 2016-8-30 14:26
其实这个不是问题的,多从机同时回复,会造成总线数据错乱,到主机这边的现象就是应答数据校验不正确或无 ...

我们深入探讨下 例如:当前网络内有10个从机一个主机,属于新建网络,主机不知道任何从机地址,这个时候主机发送一个广播指令,广播指令后10个从机如何应答?我们先撇开从机地址冲突这个点,就算10个都不冲突,从机如何知道应该何时发送数据,因为485本身就是不支持多个点同时发送数据的,如果10个从机收到广播立即回复,必然会发送冲突,极端情况永远都是冲突状态。然后我么从主机层面看,主机发现数据错误怎么判断是发送时间上的冲突还是地址冲突,或者还有可能本身网络错误,这个时候怎么处理?

出0入0汤圆

 楼主| 发表于 2016-8-31 10:00:20 | 显示全部楼层
norman33 发表于 2016-8-31 09:33
我们深入探讨下 例如:当前网络内有10个从机一个主机,属于新建网络,主机不知道任何从机地址,这个时候 ...

这种组网通信需要建立类似ZIGBEE或者CAN那样的通信机制,实时对总线进行监听,或者主机逐个查询从机是否需要发送数据,至于分配地址,除了读处理器ID或硬件编码真没想到好的方法

出0入0汤圆

发表于 2016-8-31 10:08:10 | 显示全部楼层
norman33 发表于 2016-8-31 09:33
我们深入探讨下 例如:当前网络内有10个从机一个主机,属于新建网络,主机不知道任何从机地址,这个时候 ...

对于之前做过的20多个节点的网络,我们规定的地址范围是1~40,广播枚举设备命令的要求是,设备收到命令后,根据自身地址,延时一个时间(Delay=(地址-1)x200毫秒)再发送应答,可以数据包保证不冲突,比如地址为3的设备延时400毫秒;应答数据包只有10个字节,即使按9600bps的波特率,传输完成也只需要不到20毫秒的时间,实际我们是用19200bps通讯的,裕量更大。
26个设备全部应答完的时间是7秒,主机在这个时间内不发数据,收到一个有效应答,就把在地址表中将其置为有效,中途可能会因为地址冲突,收到一连串的无效应答数据,根据收到的时间,按200毫秒的时间片,以及在其后面最近一个有效应答包的地址,可以估算有冲突的地址。

只有一种情况下会比较麻烦,但我们没遇到过,就是两个设备地址一样,但是应答时很同步,叠加在总线上的就是一个有效的数据包,这时在主机这边的现象就是设备数量少了,处理操作是告警,让管理员决定是否全部设备都重置地址

出0入36汤圆

发表于 2016-8-31 14:18:05 | 显示全部楼层
菜包 发表于 2016-8-31 10:08
对于之前做过的20多个节点的网络,我们规定的地址范围是1~40,广播枚举设备命令的要求是,设备收到命令后 ...

嗯 除了这种延迟以外还有种办法就是令牌环 485在这种情况下最多也只能做到这样了。在网上就要在协议层加碰撞检测和规避了

出0入0汤圆

发表于 2016-9-21 16:11:07 | 显示全部楼层
上几楼的大虾说的 LIN 方式是一个很好的方法,支持节点多结构简单,传输距离远, LIN一般是12V的电压通信,不防考虑考虑
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-21 23:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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