于RS485的多机通信程序主机端
RS485多机通信一主机两个下位机

一、原理图
二、程序
1、上位机程序
#include "main_host.h"
/*延时t毫秒*/
void delay(uint t)
{
uint i;
while(t--)
{
/*对于11.0592M时钟,约延时1ms */
}
/*主程序*/
void main()
{
uchar i = 0;
uchar addr_tmp;
uchar data_tmp;
init_serial();//串口初始化
EA = 0;//关闭所有中断
/*发送地址帧并接收应答信息,如果接收的信号与发送的地址信息不同,则重新发送地址帧*/
P0=0xff;
addr=P0; //下位机地址初值(第一个下位机地址)
P1=addr;
/*进入设备应答*/
while(1)
{
SM2 = 1;//只接收地址帧
/*如果接收到的地址帧不是本机地址,则继续等待*/
addr_tmp = addr-1;
while (addr_tmp!=addr)
{
addr_tmp=ReciveUart();
}
/*发送本机地址作为应答信号,准备接收数据*/
#define uint unsigned int
/*握手信号宏定义*/
#define DataCMD 0x55//接收成功
#define ERR 0xaa//接收错误
#define BASE_ADDR 0x51 //下位机地址基址
RS485总线通信系统的设计及实现毕业论文

RS485总线通信系统的设计及实现毕业论⽂本科学⽣毕业论⽂论⽂题⽬:RS485总线通信系统的设计与实现学院:年级:专业:姓名:学号:指导教师:摘要⽆论是⼯业控制还是信号测试领域,实现不同通讯协议的数据融合都有着迫切需要。
但是⽬前市场中存在的协议转换器只能满⾜两种协议之间的转换,如RS485转RS232,USB转RS485等,但是经常存在着多种数据总线并存的情况,因此研制多种总线协议转换的设备有着⽐较⼤的实际意义。
除此之外,⽬前接⼝标准的RS485总线通信协议不统⼀,需设计⼀个⾼效稳定的通信协议。
基于以上原因,本论⽂提出⼀种基于⾼速RS485的多总线通信系统。
整个系统包含多个RS485节点,各个节点包含的通讯接⼝包括RS232,RS485和USB,从⽽实现这三类总线的通讯协议的转换。
设计并实现了⼀种适⽤于微机和单⽚机之间串⾏通信的通信协议,采⽤RS485简便,通信可靠性⾼总线标准,可⽤于⼯业测控和控制现场。
实验结果表明,该通信协议是切实可⾏的,达到了预期的设计要求。
关键词RS485总线;主从式;多机通信;通信协议AbstractWhether in the field of industrial control or signal test, the achievement of data fusion which is based on different communication protocol is urgent needed. However, in the current market, protocol converter can only achieve conversion between two protocols, such as RS485 to RS232, USB to RS485 and so on. Cases of coexistence data bus, it has great practical significance to develop an equipment for protocol conversion among different buses.Based on the reasons above, a high-speed RS485-based multi-bus communication system is presented in this paper. The entire system which is used to realize the three categories of bus communication protocol conversion consists of someRS485 nodes, each node contains the communication interfaces including RS232, RS485 and USB. In the practical application, the number of nodes can be changed as required to formsystem, for achievement of data fusion between a variety of bus communication protocol.Key wordsRS485 bus; Serial Bus; Protocol Conversion; Communication protocol⽬录摘要............................................................................................................................. I Abstract .....................................................................................................................II 第⼀章绪论 (1)1.1 研究背景及意义 (1)1.2 RS485总线通信系统研究现状 (2)第⼆章RS485介绍 (4)2.1 RS485标准 (4)2.2 MAX485芯⽚介绍 (4)2.3 RS485总线组⽹⽅式 (5)2.4 RS485⽅式构成的多机通信原理 (5)第三章系统协议及硬件设计 (7)3.1 RS485通信协议设计 (7)3.1.1 物理层设计 (7)3.1.2 数据链路层设计 (8)3.1.3 应⽤层设计 (8)3.1.4 通信协议 (8)3.2 系统硬件设计 (10)3.2.1 PC与RS485总线的接⼝ (10)3.2.2 RS485⽅式构成的多机通信 (10)3.2.3 单⽚机与PC机串⾏通信系统构成 (11)第四章系统的软件实现 (12)4.1 上下位机的关系 (13)4.2 下位机通信软件的设计 (14)4.3 上位机通信软件的设计 (16)4.3.1 通信协议设计 (16)4.3.2 多机传输 (17)4.3.3 差错控制 (18)4.4 程序设计 (19)第五章系统问题解决措施 (20)5.1 总线隔离 (20)5.2 失效保护 (20)5.3 电磁⼲扰问题 (20)结论 (22)参考⽂献 (23)致 (24)第⼀章绪论所谓通信,不仅仅要实现数据的传输,更应该体现准确性,也称可靠性传输,最好具有⼀定的纠错和检错能⼒。
RS485——精选推荐

RS485通信协议RS485接口原理图RS485接口RS485采用差分信号负逻辑2V6V表示“1”- 6V- 2V表示“0”。
RS485有两线制和四线制两种接线四线制是全双工通讯方式两线制是半双工通讯方式。
在RS485通信网络中一般采用的是主从通信方式即一个主机带多个从机。
很多情况下连接RS-485通信链路时只是简单地用一对双绞线将各个接口的“A”、“B”端连接起来。
而忽略了信号地的连接这种连接方法在许多场合是能正常工作的但却埋下了很大的隐患这有二个原因1共模干扰问题RS-485接口采用差分方式传输信号的方式并不需要相对于某个参照点来检测信号系统只需检测两线之间的电位差就可以了。
因此往往忽视了收发器有一定的共模电压范围RS-485收发器共模电压范围为-712V只有满足上述条件整个网络才能正常工作。
当网络线路中共模电压超出此范围时就会影响通信的稳定可靠甚至损坏接口。
2EMI问题发送驱动器输出信号中的共模部分需要一个返回通路如没有一个低阻的返回通道信号地就会以辐射的形式返回源端整个总线就会像一个巨大的天线向外辐射电磁波。
RS485同RS232连接由于PC机默认的只带有RS232接口有两种方法可以得到PC上位机的RS485电路1通过RS232/RS485转换电路将PC机串口RS232信号转换成RS485信号对于情况比较复杂的工业环境最好是选用防浪涌、带隔离珊的产品。
2通过PCI的串口卡可以直接选用输出信号为RS485类型的扩展卡。
RS485电缆在低速、短距离、无干扰的场合可以采用普通的双绞线反之在高速、长线传输时则必须采用阻抗匹配一般为120Ω的RS485专用电缆STP-120Ωfor RS485 CANone pair 18 AWG而在干扰恶劣的环境下还应需铠装、双绞屏蔽电缆ASTP-120ΩforRS485 CAN one pair 18 AWG。
在使用RS485接口时对于特定的传输线路从RS485接口到负载其数据信号传输所允许的最大电缆长度与信号传输的波特率成反比这个长度数据主要是受信号失真及噪声等影响所影响。
RS485组网通讯

RS485组网通讯RS485简介智能仪表是随着80 年代初单片机技术的成熟而发展起来的,现在世界仪表市场基本被智能仪表所垄断。
究其原因就是企业信息化的需要,企业在仪表选型时其中的一个必要条件就是要具有联网通信接口。
最初是数据模拟信号输出简单过程量,后来仪表接口是RS232接口,这种接口可以实现点对点的通信方式,但这种方式不能实现联网功能。
随后出现的RS485解决了这个问题。
下面我们就简单介绍一下RS485。
RS485接口RS485 采用差分信号负逻辑,+2V~+6V表示“0”,- 6V~- 2V表示“1”。
RS485有两线制和四线制两种接线,四线制只能实现点对点的通信方式,现很少采用,现在多采用的是两线制接线方式,这种接线方式为总线式拓朴结构在同一总线上最多可以挂接32个结点。
在RS485通信网络中一般采用的是主从通信方式,即一个主机带多个从机。
很多情况下,连接RS-485通信链路时只是简单地用一对双绞线将各个接口的“A”、“B”端连接起来。
而忽略了信号地的连接,这种连接方法在许多场合是能正常工作的,但却埋下了很大的隐患,这有二个原因:(1)共模干扰问题:RS-485接口采用差分方式传输信号方式,并不需要相对于某个参照点来检测信号,系统只需检测两线之间的电位差就可以了。
但人们往往忽视了收发器有一定的共模电压范围, RS-485收发器共模电压范围为-7~+12V,只有满足上述条件,整个网络才能正常工作。
当网络线路中共模电压超出此范围时就会影响通信的稳定可靠,甚至损坏接口。
(2)EMI问题:发送驱动器输出信号中的共模部分需要一个返回通路,如没有一个低阻的返回通道(信号地),就会以辐射的形式返回源端,整个总线就会像一个巨大的天线向外辐射电磁波。
由于PC机默认的只带有RS232接口,有两种方法可以得到PC上位机的RS485电路:(1)通过RS232/RS485转换电路将PC机串口RS232信号转换成RS485信号,对于情况比较复杂的工业环境最好是选用防浪涌带隔离珊的产品。
RS485 通信

RS485 通信1在电能表中的应用由于历史的原因,我国在制定DL/T 614-1997《电子式多功能电能表》及DL/T 645-1997《电子式多功能电能表通讯协议》时将RS-485标准串行通讯接口作为电表的通讯接口,并详细地定义了物理层、链路层、应用层,结束了以前电表厂家规约各不兼容、互相不能抄的尴尬局面。
各电表厂家遵循相同的协议标准对电表进行读写操作,简化了电表抄表应用及维护的工作量。
使得国内的智能电表基本上可以做到互联互通。
但是目前国内的485抄表还存在一些问题,主要是通信成功率低、不能做到即连即通、易损坏等。
2物理层、链路层及数据传输2.1物理层A)共模输入电压:-7V~+12V。
B)差模输入电压:大于0.2V。
C)三态方式输出。
D)半双工通信方式。
E)驱动能力不小于32个同类接口。
F)总线是无源的,由费率装置或数据终端提供电源。
G)逻辑“1”以A、B两线间的电压差为+(2~6)V表示;逻辑“0”以两线间的电压差为-(2~6)V表示。
2.2链路层及数据传输通讯链路的建立与解除由主站发出的信息帧来控制,帧的组成如表:域起始符地址域起始符控制码长度数据域校验码结束码字节代码68H A0 A1 A2 A3 A4 A5 A6 68H C L DA TA CS 16H由上表可知,帧由起始符、地址域、控制码、数据长度、数据域、校验码及结束符等7个域组成,每部分由若干字节组成。
DL/T 645-1997规定,在发送帧信息之前,先发送1~4个字节FEH,其目的是预先拉高控制总线,以唤醒接收方,保障帧信息的顺利接收。
DL/T 645-1997规定了主—从结构的半双工通讯方式。
每次通讯都是由主站向从站发出请求命令帧开始,从站根据要求作出响应。
收到命令帧后的响应延时称作帧间延时Td:20ms≤Td≤500ms。
字节之间停顿时间称作字节间延时Tb:Tb≤500ms。
如图1所示:3RS485在电表通讯中的常见问题及解决方案3.1收发时序不匹配现象1:485通讯不成功,用逻辑分析仪查看,发送的码字正确,电能表返回码字也符合规约。
关于RS485的详细说明

串行口RS485通讯协议1.1通讯概述本公司系列变频器向用户提供工业控制中通用的RS485通讯接口。
通讯协议采用MODBUS标准通讯协议,该变频器可以作为从机与具有相同通讯接口并采用相同通讯协议的上位机(如PLC控制器、PC机)通讯,实现对变频器的集中监控,另外用户也可以使用一台变频器作为主机,通过RS485接口连接数台本公司的变频器作为从机。
以实现变频器的多机联动。
通过该通讯口也可以接远控键盘。
实现用户对变频器的远程操作。
本变频器的MODBUS通讯协议支持两种传送方式:RTU方式和ASCII方式,用户可以根据情况选择其中的一种方式通讯。
下文是该变频器通讯协议的详细说明。
1.2通讯协议说明1.2.1通讯组网方式(1) 变频器作为从机组网方式:图9-1 从机组网方式示意图(2) 多机联动组网方式:单主机单从机单主机多从机图9-2 多机联动组网示意图1.2.2通信协议方式该变频器在RS485网络中既可以作为主机使用,也可以作为从机使用,作为主机使用时,可以控制其它本公司变频器,实现多级联动,作为从机时,PC 机或PLC可以作为主机控制变频器工作。
具体通讯方式如下:(1)变频器为从机,主从式点对点通信。
主机使用广播地址发送命令时,从机不应答。
(2)变频器作为主机,使用广播地址发送命令到从机,从机不应答。
(3)用户可以通过用键盘或串行通信方式设置变频器的本机地址、波特率、数据格式。
(4) 从机在最近一次对主机轮询的应答帧中上报当前故障信息。
1.2.3通讯接口方式通讯为RS485接口,异步串行,半双工传输。
默认通讯协议方式采用ASCII 方式。
默认数据格式为:1位起始位,7位数据位,2位停止位。
默认速率为9600bps,通讯参数设置参见P3.09~P3.12功能码。
1.3 ASCII通讯协议字符结构:10位字符框(For ASCII)(1-7-2格式,无校验)(1-7-1格式,奇校验)(1-7-1格式,偶校验)11位字符框(For RTU)(1-8-2格式,无校验)(1-8-1格式,奇校验)(1-8-1格式,偶校验)通讯资料结构:ASCII模式通讯地址:00H:所有变频器广播(broadcast)01H:对01地址变频器通讯。
rs-485

RS-485又名TIA-485-A, ANSI/TIA/EIA-485或TIA/EIA-485。
RS485是一个定义平衡数字多点系统中的驱动器和接收器的电气特性的标准,该标准由电信行业协会和电子工业联盟定义。
使用该标准的数字通信网络能在远距离条件下以及电子噪声大的环境下有效传输信号。
RS-485使得连接本地网络以及多支路通信链路的配置成为可能。
RS485有两线制和四线制两种接线,四线制只能实现点对点的通信方式,现很少采用,多采用的是两线制接线方式,这种接线方式为总线式拓扑结构,在同一总线上最多可以挂接32个节点。
在低速、短距离、无干扰的场合可以采用普通的双绞线,反之,在高速、长线传输时,则必须采用阻抗匹配(一般为120Ω)的RS485专用电缆(STP-120Ω(用于RS485 & CAN)一对18AWG),而在干扰恶劣的环境下还应采用铠装型双绞屏蔽电缆(ASTP-120Ω(用于RS485 & CAN)一对18AWG)。
在使用RS485接口时,对于特定的传输线路,从RS485接口到负载其数据信号传输所允RS-485通讯电缆结构图许的最大电缆长度与信号传输的波特率成反比,这个长度数据主要是受信号失真及噪声等因素所影响。
理论上,通信速率在100Kbps及以下时,RS485的最长传输距离可达1200米,但在实际应用中传输的距离也因芯片及电缆的传输特性而有所差异。
在传输过程中可以采用增加中继的方法对信号进行放大,最多可以加八个中继,也就是说理论上RS485的最大传输距离可以达到10.8公里。
如果确实需要长距离传输,可以采用光纤为传播介质,收发两端各加一个光电转换器,多模光纤的传输距离是5到10公里,而采用单模光纤可达50公里的传播距离。
我们把工业网络归结为三类:RS485网络、HART网络和现场总线网络。
HART网络:HART是由艾默生提出一个过度性总线标准,主要是在4~20毫安电流信号上面叠加数字信号,物理层采用BELL202频移键控技术,以实现部分智能仪表的功能,但此协议不是一个真正意义上开放的标准。
基于RS485的多主机对等通信系统的设计与实现

基于RS485的多主机对等通信系统的设计与实现一、引言现代社会对通信技术的要求越来越高,无线通信技术的应用广泛,然而在某些特定环境下,无线通信可能会受到干扰或信号弱等问题影响。
为了解决这个问题,基于RS485的多主机对等通信系统应运而生。
这种系统可以实现多主机之间的高效、可靠的通信,具有广泛的应用前景。
本文将介绍基于RS485的多主机对等通信系统的设计与实现。
二、RS485通信协议简介RS485是一种串行通信协议,可实现远距离高速数据传输。
它采用差分信号传输,在抗干扰能力和传输距离方面具有优势。
RS485通信协议定义了电气特性、物理层规范、通信帧格式等内容,为多主机对等通信系统的设计与实现提供了基础。
三、多主机对等通信系统的设计1. 系统框架设计多主机对等通信系统由主机、从机和总线组成。
主机之间可以进行双向通信,彼此平等地参与通信过程。
总线通过RS485通信协议连接主机和从机,实现数据的传输和交换。
2. 硬件设计(1)选择合适的RS485通信模块,该模块需要支持多主机对等通信的功能,并提供相应的接口。
(2)确定主机和从机的配置数量和位置,根据实际需求设计电路板布局。
(3)为每个主机和从机分配唯一的地址,以便在通信过程中进行识别和区分。
3. 软件设计(1)主机软件设计:主机负责发起通信请求、接收、解析和处理数据。
软件需要实现主机之间的通信协议,确保数据的正确传输和处理。
(2)从机软件设计:从机负责接收主机发送过来的数据,并做出相应的响应。
软件需要实现从机之间的通信协议,确保数据的正确接收和响应。
四、多主机对等通信系统的实现1. 硬件实现(1)按照设计要求,搭建多主机对等通信系统的硬件电路。
(2)连接RS485通信模块和其他硬件设备,搭建通信网络。
2. 软件实现(1)编写主机软件代码,实现主机之间的通信功能。
(2)编写从机软件代码,实现从机之间的通信功能。
(3)进行系统调试和测试,确保数据的正确传输和处理。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
于RS-485的多机通信程序(主机端)//-----------------------函数声明,变量定义---------------------#include ;sbit RE_DE=P1^0;#define COUNT 10 // 定义接收缓冲区大小#define Slaver_NUM 10unsigned char bdata flag; //在可位寻址去定义一个标志变量sbit time_over_flag =flag^0; //接收超时标志unsigned char buffer[COUNT]; //定义缓冲区unsigned char point; //定义缓冲区位置指示unsigned char Slave_AD[Slaver_NUM]; //定义有效地址存放区unsigned char ADD_num; //有效地址个数unsigned char idata count_10ms; //用于表示有多少次10ms中断unsigned char idata send_data[7]={0x31,0x32,0x33,0x34,0x35,0x36,0x37}; //与定义发送数据,共7位void UART_init(); //串口初始化函数void COM_send(void); //串口接收函数unsigned char CLU_checkdata(void); //计算校验位函数//---------------------------------------------------------------// 函数名称: UART_init()串口初始化函数// 函数功能:在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s// 串口接收中断允许,发送中断禁止,设定定时器中断允许//---------------------------------------------------------------void UART_init(){//初始化串行设置SCON =0x58; //选择串口工作方式为1,打开接收允许,TB8=1TMOD =0x21; //定时器1工作在方式2,定时器0工作在方式1TR1 =1; //启动定时器T1ES=1; //允许串行口中断PS=1; //设计串行口中断优先级//初始化定时器1TH1 =0xfd; //实现波特率9600(系统时钟11.0592MHZ)ET1 =0; //定时器1中断禁止}//---------------------------------------------------------------// 函数名称: timer0_init()初始化定时器0// 函数功能:设置timer0工作模式//---------------------------------------------------------------void timer0_init(){time_over_flag=0;count_10ms=0;ADD_num=0;TL0=0x0F0; //T0用于产生10ms的中断TH0=0x0D8; //50次T0中断产生1次超时溢出ET0=1; //允许定时器0中断}//---------------------------------------------------------------// 函数名称: system_init()系统初始化// 函数功能:调用串口、定时器初始化函数,完成系统初始化//---------------------------------------------------------------void system_init(void){//系统总设置UART_init();timer0_init();EA =1; //单片机中断允许}//---------------------------------------------------------------// 函数名称: com_interrup()串口接收中断处理函数// 函数功能:接收包括起始位"S"在内的十位数据到数据缓冲区//---------------------------------------------------------------com_interrupt(void) interrupt 4 using 3{unsigned char RECEIVR_buffer;if(RI) //处理接收中断{RI=0; //清除中断标志位RECEIVR_buffer=SBUF; //接收串口数据if(point==0) //如果还没有接收到起始位{if(RECEIVR_buffer==0xFE) //判断是否起始标志位{buffer[point++]=RECEIVR_buffer;//把接收到的数据放入接收缓存区}elsepoint=0; //不是,继续等待起始位}else if(point>;0&&point<10) //判断是否接收够十位数据buffer[point++]=RECEIVR_buffer; //不够,把接收到的数据放入接收缓存区else if(point==10){if(RECEIVR_buffer==0xEF) //判断结束标志位是否正确{buffer[point]=RECEIVR_buffer; //把接收到的数据放入接收缓存区Slave_AD[ADD_num++]=buffer[2]; //把接收到的地址放到地址存储器//表示该地址有有效设备}elsepoint=0; //不是,继续等待起始位}else point=0; //缓冲区已满,清除缓存区内数据重新接收}if(TI) //串口发送中断{TI=0; //清除发送中断}}//---------------------------------------------------------------// 函数名称: timer0_interrup()// 函数功能:定时器T0中断服务程序// 函数说明:T0枚10ms中断一次,连续中断50次置time_over_flag=1;//-----------------------------------------------timer0_interrupt(void) interrupt 1 using 2{count_10ms++;if(count_10ms==50){ET0=0; //关闭定时器T0中断TR0=0; //停止定时器T0time_over_flag=1;//设置接收超时标志count_10ms=0x00; //10ms计数器复位}else{TL0=0x0F0; //重装定时器初始值TH0=0x0D8;}}//---------------------------------------------------------------// 函数名称: COM_send()串口发送函数// 函数功能:把数据缓冲区的十位数据发送出去//-----------------------------------------------void COM_send(void){RE_DE=1; //设置MAX483进入发送状态for(point=0;point<=10,TI=1;point++) //连续发送十位数据//把缓存区的数据都发送到串口{SBUF=buffer[point];TI=0;}RE_DE=0; //设置MAX483进入接收状态}//---------------------------------------------------------------// 函数名称: write_buffer()// 函数功能:写发送缓冲区十位数据//---------------------------------------------------------------void write_buffer(unsigned char slaver_add){unsigned char i;TB8=1; //打开多机通信方式buffer[0]=0xFE;buffer[1]=slaver_add;for(i=2;i<9;i++) //连续发送十位数据//把缓存区的数据都发送到串口{buffer[i]=send_data[i-2];}buffer[9]=0xEF;}//---------------------------------------------------------------// 函数名称:主函数// 函数功能:调度个子函数,完成通信过程//---------------------------------------------------------------void main(void){unsigned char i=0;system_init(); //系统初始化do{ //查旬0到10好地址有没有对应设备write_buffer(i++); //写查询第i号设备的发送信息COM_send(); //调用发送函数,完成发送timer0_init(); //完成一次查询,重新初始定时器0,准备下一次查询}while(time_over_flag&&i<10);}。