多主机串行的话,Slave1执行完成之后直接将数据结果发信息给Master,然后Master再给Slave2部署任务就是了;
乱序的话,那就并发部署任务,异步接受各个Slave的数据,等到一定的数据接收率(有冗余的case)就可以进行下一步任务了(此后接收到的标识上一个任务的ID的数据之后,仅仅收集作为评估,结果是否参与运算就看实际工作需要了)
可以使用I2C,SPI的多机通信,从机地址都是软件设置的,必须和主机当前地址一样才可以通信。
如果串口通信。,如果用软件设置的话,就是在从机的程序中加上if语句即可,if语句后面的条件即是从机地址。
1,你的程序delay是如何实现的,是不是长时间占用cpu资源的?因为串行数据传送是连续的,第一个数据ff接收到之后在shuma1()函数中delay了这么久再查询串口,之后的数据早就发送完毕了,你可能接收不到之后的了。这样可以解释为什么你一位一位发送的话显示没有问题。因为你手动发送的延时肯定>shuma1()函数中delay的总时间。
2,你的程序中shuma1()函数是在大循环中循环的。每次运行到if(ri)这行的之间的时间间隔都很久了。不利于连续接收数据。
3,还有其他的可能,我发你一个串口监控软件,可以第三方监控串口通讯。便于你调试。
4,基本上所有的串口调试助手在十六进制发送的情况下,里面空格都是无意义,只是用来把两个字节间隔开。
6,查邮件peanot@163com
7,有问题再补充
RS-485接口大多都是基于RS-232接口与电脑进行通信的,485协议编程都是基于串口编程的,而由于RS-232与RS-485接口的不同,由于RS-232只支持点对点通信,全双工通信,而RS-485是支持点对多点通信,半双工通信,基于其编写的协议有一定的相关性又有一定的区别。
RS-232接口支持点对点通信,全双工通信模式,现在对于RS-232的使用大多都是基于无Modem连接,其分为握手连接和无握手连接,握手连接方式类似于打电话,请求连接方发起连接请求发送,等待对方准备就绪并且允许发送,然后发送数据,发送数据的同时也可以接收对方发送的数据。而无握手连接则是类似于对讲,直接发送相关的数据过去,由于现在硬件功能增强,串口可以随时处于准备接收状态。在针对RS-232串口进行编程,无握手连接最简单,而握手连接则需要编写相应的应答命令之类的代码。
RS-485接口支持点对多点通信,半双工通信模式,由于485是半双工通信模式,就必须要解决数据流向问题,就像某条铁路可以双向通车,为了防止撞车追尾等事故的发生,必须要通过相应的调度来解决该问题,同样的道理,由于支持点对多点通信,也必须要通过主机进行相应的调度来解决该问题,而且主机对于整个总线必须具有绝对的控制权。关于485通信问题,我们利用老师在教室讲课作为例子来说明。
我们假设老师作为RS-485总线的主机,而学生作为485总线的从设备,而学生的学号则是从设备的地址码。老师对于整个课堂具有绝对的掌控力,一般来说,老师在上课之前会对学生进行点名以确实学生是否有缺课的,同样的道理,RS-485总线的主机一开始也会对从设备进行一次轮询,逐个地址码去询问设备是否正常并且对相关情况做个记录,防止在正常通信的时候不断呼叫并不存在的地址码而导致通信效率下降。主机对于从设备的控制是利用广播方式发送下去的,而从设备只对含有自己地址码的指令做相关的回应,在从设备做回应的情况下,其他的从设备和主机保持沉默,当从设备执行完相关指令之后,发送完毕信号给主机,主机继续执行下一条指令。就像老师在课堂讲课的时候,指定某个学生回答问题,学生回答问题过程中,其他学生和老师保持沉默,不容许课堂上有讲小话的情况,只有当学生回答完问题之后并且告知老师自己回答完毕,老师才会继续讲课或者指令另外的学生做相应的动作。485协议的编程基于上面的思路编写。
RS-485总线协议对于意外情况的处理,当485总线主机对其从设备发送相关的指令的时候,从设备可能会因为种种原因而不执行相关指令的情况,比如从设备在使用过程中损坏而不能回应相关指令,主机一般都会设定一个时延,在设定的时间之内得不到相关从设备的回应,其应该做相应的记录并且执行下一条指令。就像老师点名要求某个学生回答问题,而没有得到相应的回应,点名三次之后,还是没有回应,对于该学生的缺课做相关的记录,然后继续下面的课程。
关于485总线线路另外的一些问题也可以用老师讲课来做比喻,如老师讲课过程中,外面的噪音非常的大,从而导致学生听不到,那就需要加扩音器,对于485总线而言,就是外部干扰过大,导致衰减的485信号淹没在噪声中,需要增加深圳市鼎信鸿达科技有限公司的485中继器中继还原相关信号再次传输,同样的道理,如果教室过大,导致老师说的话并不能传到最后面的学生处,也是增加扩音器来解决问题,当485总线传输距离过长的时候,也是通过485中继器放大信号延长传输距离,还有就是如果讲课过程中,产生了混音的情况有可能会导致整个课堂都听不清楚,就将其划分为多个小教室,通过多个广播将老师的声音分别传入各个教室,使其不混杂都能够听清楚,如果将多个RS-485总线简单的按照星型连接或者树形连接方式连接,就会产生信号反射等问题,就必须采用深圳市鼎信鸿达科技有限公司的485集线器或者485中继器将其相互隔离,独立驱动,不会相互影响,从而保证485通信的稳定性。
200米以上用485接口嘛
问题的提出
在工业控制及测量领域较为常用的网络之一就是物理层采用RS-485通信接口所组成的工控设备网络。这种通信接口可以十分方便地将许多设备组成一个控制网络。从目前解决单片机之间中长距离通信的诸多方案分析来看,RS-485总线通信模式由于具有结构简单、价格低廉、通信距离和数据传输速率适当等特点而被广泛应用于仪器仪表、智能化传感器集散控制、楼宇控制、监控报警等领域。但RS485总线存在自适应、自保护功能脆弱等缺点,如不注意一些细节的处理,常出现通信失败甚至系统瘫痪等故障,因此提高RS-485总线的运行可靠性至关重要。
图1 RS485通信接口原理图
2 硬件电路设计中需注意的问题
21 电路基本原理
某节点的硬件电路设计如图1所示,在该电路中,使用了一种RS-485接口芯片SN75LBC184,它采用单一电源Vcc,电压在+3~+55 V范围内都能正常工作。与普通的RS-485芯片相比,它不但能抗雷电的冲击而且能承受高达8 kV的静电放电冲击,片内集成4个瞬时过压保护管,可承受高达400 V的瞬态脉冲电压。因此,它能显著提高防止雷电损坏器件的可靠性。对一些环境比较恶劣的现场,可直接与传输线相接而不需要任何外加保护元件。该芯片还有一个独特的设计,当输入端开路时,其输出为高电平,这样可保证接收器输入端电缆有开路故障时,不影响系统的正常工作。另外,它的输入阻抗为RS485标准输入阻抗的2倍(≥24 kΩ),故可以在总线上连接64个收发器。芯片内部设计了限斜率驱动,使输出信号边沿不会过陡,使传输线上不会产生过多的高频分量,从而有效扼制电磁干扰。在图1中,四位一体的光电耦合器TLP521让单片机与SN75LBC184之间完全没有了电的联系,提高了工作的可靠性。基本原理为:当单片机P16=0时,光电耦合器的发光二极管发光,光敏三极管导通,输出高电压(+5 V),选中RS485接口芯片的DE端,允许发送。当单片机P16=1时,光电耦合器的发光二极管不发光,光敏三极管不导通,输出低电压(0 V),选中RS485接口芯片的RE端,允许接收。SN75LBC184的R端(接收端)和D端(发送端)的原理与上述类似。
22 RS-485的DE控制端设计
在RS-485总线构筑的半双工通信系统中,在整个网络中任一时刻只能有一个节点处于发送状态并向总线发送数据,其他所有节点都必须处于接收状态。如果有2个节点或2个以上节点同时向总线发送数据,将会导致所有发送方的数据发送失败。因此,在系统各个节点的硬件设计中,应首先力求避免因异常情况而引起本节点向总线发送数据而导致总线数据冲突。以MCS51系列的单片机为例,因其在系统复位时,I/O口都输出高电平,如果把I/O口直接与RS-485接口芯片的驱动器使能端DE相连,会在CPU复位期间使DE为高,从而使本节点处于发送状态。如果此时总线上有其他节点正在发送数据,则此次数据传输将被打断而告失败,甚至引起整个总线因某一节点的故障而通信阻塞,继而影响整个系统的正常运行。考虑到通信的稳定性和可靠性,在每个节点的设计中应将控制RS485总线接口芯片的发送引脚设计成DE端的反逻辑,即控制引脚为逻辑“1”时,DE端为“0”;控制引脚为逻辑“0”时,DE端为“1”。在图1中,将CPU的引脚P16通过光电耦合器驱动DE端,这样就可以使控制引脚为高或者异常复位时使SN75LBC184始终处于接收状态,从而从硬件上有效避免节点因异常情况而对整个系统造成的影响。这就为整个系统的通信可靠奠定了基础。
此外,电路中还有1片看门狗MAX813L,能在节点发生死循环或其他故障时,自动复位程序,交出RS-485总线控制权。这样就能保证整个系统不会因某一节点发生故障而独占总线,导致整个系统瘫痪。
23 避免总线冲突的设计
当一个节点需要使用总线时,为了实现总线通信可靠,在有数据需要发送的情况下先侦听总线。在硬件接口上,首先将RS-485接口芯片的数据接收引脚反相后接至CPU的中断引脚INT0。在图1中,INT0是连至光电耦合器的输出端。当总线上有数据正在传输时,SN75LBC184的数据接收端(R端)表现为变化的高低电平,利用其产生的CPU下降沿中断(也可采用查询方式),能得知此时总线是否正“忙”,即总线上是否有节点正在通信。如果“空闲”,则可以得到对总线的使用权限,这样就较好地解决了总线冲突的问题。在此基础上,还可以定义各种消息的优先级,使高优先级的消息得以优先发送,从而进一步提高系统的实时性。采用这种工作方式后,系统中已经没有主、从节点之分,各个节点对总线的使用权限是平等的,从而有效避免了个别节点通信负担较重的情况。总线的利用率和系统的通信效率都得以大大提高,从而也使系统响应的实时性得到改善,而且即使系统中个别节点发生故障,也不会影响其他节点的正常通信和正常工作。这样使得系统的“危险”分散了,从某种程度上来说增强了系统的工作可靠性和稳定性。
24 RS-485输出电路部分的设计
在图1中,VD1~VD4为信号限幅二极管,其稳压值应保证符合RS-485标准,VD1和VD3取12 V,VD2 和VD4取7 V,以保证将信号幅度限定在-7~+12 V之间,进一步提高抗过压的能力。考虑到线路的特殊情况(如某一节点的RS-485芯片被击穿短路),为防止总线中其他分机的通信受到影响,在SN75LBC184的信号输出端串联了2个20 Ω的电阻R1和R2,这样本机的硬件故障就不会使整个总线的通信受到影响。在应用系统工程的现场施工中,由于通信载体是双绞线,它的特性阻抗为120 Ω左右,所以线路设计时,在RS485网络传输线的始端和末端应各接1个120 Ω的匹配电阻(如图1中的R3),以减少线路上传输信号的反射。
25 系统的电源选择
对于由单片机结合RS-485组建的测控网络,应优先采用各节点独立供电的方案,同时电源线不能与RS-485信号线共用同一股多芯电缆。RS-485信号线宜选用截面积075 mm2以上的双绞线而不是平直线,并且选用线性电源TL750L05比选用开关电源更合适。TL750L05必须有输出电容,若没有输出电容,则其输出端的电压为锯齿波形状,锯齿波的上升沿随输入电压变化而变化,加输出电容后,可以抑制该现象。
3 软件的编程
SN75LBC184在接收方式时,A、B为输入,R为输出;在发送方式时,D为输入,A、B为输出。当传送方向改变一次后,如果输入未变化,则此时输出为随机状态,直至输入状态变化一次,输出状态才确定。显然,在由发送方式转入接收方式后,如果A、B状态变化前,R为低电平,在第一个数据起始位时,R仍为低电平,CPU认为此时无起始位,直到出现第一个下降沿,CPU才开始接收第一个数据,这将导致接收错误。由接收方式转入发送方式后,D变化前,若A与B之间为低电压,发送第一个数据起始位时,A与B之间仍为低电压,A、B引脚无起始位,同样会导致发送错误。克服这种后果的方案是:主机连续发送两个同步字,同步字要包含多次边沿变化(如55H ,0AAH),并发送两次(第一次可能接收错误而忽略) ,接收端收到同步字后,就可以传送数据了,从而保证正确通信。
为了更可靠地工作,在RS485总线状态切换时需要适当延时,再进行数据的收发。具体的做法是在数据发送状态下,先将控制端置“1”,延时05 ms左右的时间,再发送有效的数据,数据发送结束后,再延时05 ms,将控制端置“0”。这样的处理会使总线在状态切换时,有一个稳定的工作过程。数据通信程序基本流程图如图2所示。
图2 数据通信程序基本流程图
单片机通信节点的程序基本上可以分为6个主要部分,分别为预定义部分、初始化部分、主程序部分、设备状态检测部分、帧接收部分和帧发送部分。预定义部分主要定义了通信中使用的握手信号,用于保存设备信息的缓冲区和保存本节点设备号的变量。设备状态检测部分应能在程序初始化后,当硬件发生故障时,作出相应的反应。主程序部分应能接收命令帧,并根据命令的内容作出相应的回应。为缩短篇幅,这里仅给出主程序部分的代码。如下所示:
/ 主程序流程 /
while(1) { //主循环
if(recv_cmd(&type)==0) //发生帧错误或帧地址与本机
//地址不符,丢弃当前帧后返回
continue;
switch(type) {
case __ACTIVE_: //主机询问从机是否存在
send_data(__OK_, 0,dbuf);//发送应答信息
break;
case __GETDATA_:
len = strlen(dbuf);
send_data(__STATUS_, len,dbuf);//发送状态信息
break;
default:
break; //命令类型错误,丢弃当前帧后返回
}
}
4 结论
RS-485由于使用了差分电平传输信号,传输距离比RS-232更长,最多可以达到3000 m,因此很适合工业环境下的应用。但与CAN总线等更为先进的现场工业总线相比,其处理错误的能力还稍显逊色,所以在软件部分还需要进行特别的设计,以避免数据错误等情况发生。另外,系统的数据冗余量较大,对于速度要求高的应用场所不适宜用RS-485总线。虽然RS-485总线存在一些缺点,但由于它的线路设计简单、价格低廉、控制方便,只要处理好细节,在某些工程应用中仍然能发挥良好的作用。总之,解决可靠性的关键在于工程开始施工前就要全盘考虑可采取的措施,这样才能从根本上解决问题,而不要等到工程后期再去亡羊补牢。
以上就是关于多机通信:主机怎么样才能让从机1执行完程序再给从机2发数据呢全部的内容,包括:多机通信:主机怎么样才能让从机1执行完程序再给从机2发数据呢、51单片机多机通信从机的什么2在哪设置、单片机串口多机通讯问题,一主多从,各个从机硬件、程序都一样,请问怎么实现通讯等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)