找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3901|回复: 11
收起左侧

探讨51单片机多机通讯的问题

[复制链接]
ID:47286 发表于 2017-4-19 14:13 | 显示全部楼层 |阅读模式
51单片机的多机通讯体系在整个系统里只有一个主机 其它都是从机 一直处在接收状态 而且接收状态要比较接收位是否呼叫的是自己 那这个时候如果主机想发送一个给所有模块都接收的指令怎么办 难道要把每个从机都喊一遍 那为什么不用一对一的方式 所有从机都判断接收数据的第一位 如果和自己ID相符就是给自己的 不相符就不再接收 如果第一位表示广播 就所有从机都动作 这样虽然每次数据流发送都会多一位 总比一主多从都喊一遍快吧
回复

使用道具 举报

ID:191208 发表于 2017-4-19 14:18 | 显示全部楼层
说的有点笼统
回复

使用道具 举报

ID:191208 发表于 2017-4-19 14:19 | 显示全部楼层
能有相关的源码吗
回复

使用道具 举报

ID:151348 发表于 2017-4-19 14:32 | 显示全部楼层
既然有通信协议,而且第一位是ID,那么规定一个公用的ID,相当于一个从机有2个ID,一个ID为唯一ID,作为私聊用,另一个ID即公用ID,作为广播收听
回复

使用道具 举报

ID:47286 发表于 2017-4-19 15:39 | 显示全部楼层
imxuheng 发表于 2017-4-19 14:32
既然有通信协议,而且第一位是ID,那么规定一个公用的ID,相当于一个从机有2个ID,一个ID为唯一ID,作为私 ...

欧了 说的是
回复

使用道具 举报

ID:47286 发表于 2017-4-19 16:21 | 显示全部楼层
17719495093 发表于 2017-4-19 14:19
能有相关的源码吗

没有源码

我日常工作接触以太网多 所以总想能不能让UART像以太网一样每个模块随意发送 UART很难完全做到 以太网通讯是分时复用 每个数据包里包括来源 目的 序号 等很多信息 单片机这么做开销就太大了 不合算 但是想探讨一下如何能更接近以太网模式

在百度上搜了一些51的多机通讯范例 读之后有两个问题

1. 多机通讯自身ID号也需要写程序去对比 并不是有专门的寄存器设置后当发生串口中断时自动对比 因此我并不觉得用多机方法比单机方法好 判断上和单机通讯开销一样 却比单机通讯多了对SM RB TB的操作

2. 多机通讯里 核心的问题并不是呼叫谁 而是信道的占用 UART从硬件上 发出去的东西每个模块都可以收到 只要驱动能力够就行 但UART不是分时复用 所有模块收到指令后各自处理自己的没问题 但如果有返回通讯就有相互冲突 这种冲突通讯量小影响小 假设254个模块 每组数据50位 那就影响很大了

所以 只要解决信道占用问题 用一对一的方式就可以 不需要用更复杂的多机UART通讯 这个结论是基于发送一条广播指令 要求每个模块都执行并返回数据的情况 如果只控制其中一个模块 那么只要把指令位的广播定义改成ID号就可以

问题是 还没想出怎么解决信道占用 就是说 如果广播一个指令出去 要求所有模块返回数据的时候 如何让它们不会同时往回发东西 所以想和各位同仁及前辈探讨一下
回复

使用道具 举报

ID:151348 发表于 2017-4-19 21:25 | 显示全部楼层
dzbj 发表于 2017-4-19 16:21
没有源码

我日常工作接触以太网多 所以总想能不能让UART像以太网一样每个模块随意发送 UART很难完全做 ...

建议你考虑一下RS485+ModelBus,这个应该能满足你的要求,这里有教程http://www.51hei.com/bbs/dpj-23230-1.html
回复

使用道具 举报

ID:123289 发表于 2017-4-20 01:04 | 显示全部楼层
楼主果然厉害,思维活跃,正点。
单片机的多机通讯功能与你的想法不矛盾,即便单片机无此功能,通过软件协议也能达成楼主的思路。也就是楼主你所设想的方法。
单片机在多机接在一起时,有一对一的模式,但不排拆一对全体,如果对全体发令,切换一下模式即可。
单片机多机通讯功能,提供了一个更方便的通讯方案,要点是:从机配合中断使用,可以做到:不“叫”自己不中断,多方便呀。即大家同在一根线上,别人通讯时不会影响到我(不产生中断),而“叫”我时才中断。
回复

使用道具 举报

ID:188312 发表于 2017-4-20 09:04 | 显示全部楼层
正在弄这方面的资料
回复

使用道具 举报

ID:188312 发表于 2017-4-20 09:04 | 显示全部楼层
参考中,希望资料详细点
回复

使用道具 举报

ID:47286 发表于 2017-4-20 10:16 | 显示全部楼层
imxuheng 发表于 2017-4-19 21:25
建议你考虑一下RS485+ModelBus,这个应该能满足你的要求,这里有教程http://www.51hei.com/bbs/dpj-23230 ...

感谢前辈回复

我认为485只是UART的延长方式 并不改变UART的通讯结构 而从道理上 反而是UART的降级 因为UART是全双工的 485是单工的 双工485要用4条线 在较高的波特率下 单工也够用 只要能解决信道占用问题

485发送时拉高单线 实际测试中 一个485拉高线电压后 其它的485芯片好象不能反馈出总线的情况 如果能反馈 就好了
回复

使用道具 举报

ID:47286 发表于 2017-4-20 10:32 | 显示全部楼层
yzwzfyz 发表于 2017-4-20 01:04
楼主果然厉害,思维活跃,正点。
单片机的多机通讯功能与你的想法不矛盾,即便单片机无此功能,通过软件协 ...

感谢前辈回复

可能是我学的还浅 有一点没明白 前辈说的多机通讯可以不"叫"自己不中断 但是我看其它范例程序 都是在接收到数据后在中断或者其它地方用语句去判断 不是把id存在某个寄存器里 发生中断时自己去比对 那么和用单机通讯中 接收到一位就判断是否呼叫自己有什么区别 实际上不管多机还是单机 如果只发送ID的话实际上上都中断了一次 是这样吗
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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