-
2021-06-14 19:14:31
硬件设计
(末尾附文件)
代码设计
#include<reg51.h> #include<string.h> #include "lcd.h" #define _SUCC_ 0x0f//数据传送成功 #define _ERR_ 0xf0//数据传送失败 unsigned char aa=0xff;//主机与从机之间通信标志 unsigned char temp=0xff; unsigned char Buff[20];//数据缓冲区 unsigned char recive[6]; //用于保存从机发送的数据 sbit KEY1=P1^3; sbit KEY2=P1^2; sbit KEY3=P1^1; sbit KEY4=P1^0; sbit KEY5=P3^2; sbit KEY6=P3^3; //sbit KEY5=P1^4; //sbit KEY6=P1^5; //延时1ms函数 void delay_1ms(unsigned int i) { unsigned int x,y; for(x=i;x>0;x--) for(y=110;y>0;y--); } //串口初始化函数 void init() { TMOD=0x20; //定时器1工作于方式2 TH1=0xfd; TL1=0xfd; //波特率为9600 PCON=0; SCON=0xd0; //串口工作于方式3 TR1=1; //开启定时器 TI=0; RI=0; } //发送数据函数 void SEND_data(unsigned char *Buff) { unsigned char i,lenth,check; lenth=strlen(Buff); //计算数据长度 check=lenth; TI=0; //发送数据长度 TB8=0; //发送数据帧 SBUF=lenth; while(!TI); TI=0; for(i=0;i<lenth;i++) //发送数据 { check=check^Buff[i]; TB8=0; SBUF=Buff[i]; while(!TI); TI=0; } TB8=0; //发送校验字节 SBUF=check; while(!TI); TI=0; } //接收数据函数 unsigned char RECE_data(unsigned char *Buff) { unsigned char i; unsigned char lenth; unsigned char check; RI=0; //接收数据长度 while(!RI); if(RB8==1) { RI = 0; return 0xfe; //若接收到地址帧,则返回0xfe } lenth=SBUF; RI=0; check=lenth; for(i=0;i<lenth;i++) //接收数据 { while(!RI); if(RB8==1) //若接收到地址帧,则返回0xfe return 0xfe; Buff[i]=SBUF; check=check^(Buff[i]); RI=0; } while(!RI); //接收校验字节 if(RB8==1) //若接收到地址帧,则返回0xfe return 0xfe; temp=SBUF; RI=0; check=temp^check; //将从主机接收到的校验码与自己计算的校验码比对 if(check!=0) //校验码不一致,表明数据接收错误,向主机发送错误信号,函数返回0xff { TI=0; TB8=0; SBUF=_ERR_; while(!TI); TI=0; return 0xff; } TI=0; //校验码一致,表明数据接收正确,向主机发送成功信号,函数返回0x00 TB8=0; SBUF=_SUCC_; while(!TI); TI=0; return 0; } //发送从机地址 void ADDR_data(unsigned addr) { while(temp!=addr) //主机等待从机返回其地址作为应答信号 { TI=0; //发送从机地址 TB8=1; //发送地址帧 SBUF=addr; while(!TI); TI=0; RI=0; while(!RI); temp=SBUF; RI=0; } } void keyscan() { if(KEY1==0) { LcdWriteCom(0x01); //清屏 delay_1ms(5); if(KEY1==0) { while(!KEY1); ADDR_data(0x01);//发送从机地址 temp=_ERR_; //主机等待从机数据接收成功信号 while(temp!=_SUCC_) { unsigned char Buff[]={0xfe}; SEND_data(Buff);//发送数据 RI=0; while(!RI); temp=SBUF; RI=0; } SM2=0; //接收数据帧 aa=0xff; //从机接收数据,并将数据保存到数据缓冲区 while(aa==0xff) { aa=RECE_data(Buff); P0 = 0xff; } P0 = 0xfe; recive[0] = Buff[0]; recive[1] = Buff[1]; recive[2] = Buff[2]; } } if(KEY2==0) { LcdWriteCom(0x01); //清屏 delay_1ms(5); if(KEY2==0) { while(!KEY2); ADDR_data(0x01); temp=_ERR_; //主机等待从机数据接收成功信号 while(temp!=_SUCC_) { unsigned char Buff[]={0xff}; SEND_data(Buff); RI=0; while(!RI); RI=0; temp=SBUF; } } } if(KEY3==0) { LcdWriteCom(0x01); //清屏 delay_1ms(5); if(KEY3==0) { while(!KEY3); ADDR_data(0x02); temp=_ERR_; //主机等待从机数据接收成功信号 while(temp!=_SUCC_) { unsigned char Buff[]={0xfe}; SEND_data(Buff); RI=0; while(!RI); temp=SBUF; RI=0; } SM2=0; //接收数据帧 aa=0xff; //从机接收数据,并将数据保存到数据缓冲区 while(aa==0xff) { aa=RECE_data(Buff); P0 = 0xff; } P0 = 0xfe; /* recive[3] = Buff[0]; recive[4] = Buff[1]; recive[5] = Buff[2]; */ recive[0] = Buff[0]; recive[1] = Buff[1]; recive[2] = Buff[2]; } } if(KEY4==0) { LcdWriteCom(0x01); //清屏 delay_1ms(5); if(KEY4==0) { while(!KEY4); ADDR_data(0x02); temp=_ERR_; //主机等待从机数据接收成功信号 while(temp!=_SUCC_) { unsigned char Buff[]={0xff}; SEND_data(Buff); RI=0; while(!RI); temp=SBUF; RI=0; } } }
链接:https://pan.baidu.com/s/1O6FYzpRDkedPM2ZW6Uivuw
提取码:5jpj更多相关内容 -
FreeRTOS+RS485多机通信_freertos485_freertos485通讯_freertos_freertos+4
2021-10-02 06:57:45实现STM32F4 基于FreeRtos的多机485串口通讯 -
RS-485多主机通信的组网方式
2020-10-21 02:34:43本文以波仕电子的产品为例介绍两种RS-485多主机通信产品及其组网方式----采用RS-485共享器和采用RS-485交换机。采用共享器可以允许2台主机,而且可以对这2太主机的发送信号按照发送顺序进行优先排序,避免同时发送... -
RS-485多主机通信方式
2020-10-21 04:55:28RS-485多主机通信方式_孙汉华_武汉波仕电子有限公司传统的RS-485组网方式只允许一个主机,但是在许多情况下要求有多台主机进行控制。 -
_FreeRTOS+RS485多机通信.rar
2020-12-03 20:28:18在STM32F429下移植了FreeRTOS与RS485,方便别人减少工作量,快速下载。并且集成多机通信。方便别人减少工作量,快速下载。 -
rs485多机通信程序
2015-06-03 21:41:57rs485多机通信程序,包括主机和从机的代码。 -
RS-485多机通信的组网方式
2018-09-21 11:26:51本文介绍了以波仕转换器为代表的几种 RS-485 多机通信的组网方式:总线式、菊花链式、星形、单环冗余型。用户可以根据现场的串口设备的位置分布或者可靠性要求来选择。通信软件都是一样的,与普通的 RS-485 总线多机... -
CserialPort类的RS-485多机通信设计与实现
2021-01-31 17:59:06为解决现场工业数据采集系统中远距离多机通信的难题,设计了基于RS-485总线半双工、主从式多机通信网络。采用了以PC机为主机,Visual C++6.0为平台,使用CserialPort类编写了串口通信程序,文中并给出了关键程序;以... -
基于51单片机的RS-485多机通信
2009-12-31 00:50:25使用51单片机的串行口,通过MAX485转换信号为RS485 实现单片机多机远距离通信,多机通信.这里有一个主机3个从机. 里面有PROTEUS仿真.和说明 -
485多机通信程序
2013-09-18 16:26:52485多机通信程序(主机模式),Modbus 通讯协议。 -
PIC16F877系列单片机RS485多机通信与协议
2019-04-12 21:29:43用PIC16F877A作为主机,8个PIC16作为从机。从机的站号用拨号盘输入,要求8个号码不能相同,且只在上电时由单片机PIC16F688一次读入号码,运行后修改无效。每一个从机都用了一个电位器作为输入。当上位机发送命令65时... -
RS485多机通信,带C51源程序,带仿真!
2018-09-05 10:55:27RS485多机通信,Keil C51源程序,Proteus仿真!适合初学者与项目参考! -
485多机通信
2012-08-11 02:05:54用C写的51单片机的RS485多机通信程序。 -
V5-343-FreeRTOS实验_FreeRTOS+RS485多机通信.rar
2020-01-20 22:07:21V5-343-FreeRTOS实验_ FreeRTOS+RS485多机通信 -
单片机之串口通信 485多机通信 红外测试
2019-08-27 16:41:24我们后面会以串口通信和485通信的例子来说明其通信的过程,但是在此之前,我们还是好好的知道一下原理 计算机通信 是将计算机技术和通信技术的相结合,完成计算机与外部设备或计算机与计算机之间的信息交换 并行...我们都知道计算机肯定是需要计算机与计算机之间的通信联系,或者计算机也要和外部设备进行联系,那我们就要了解它的基本通信基础
- 串行通信
- 并行通信
我们后面会以串口通信和485通信的例子来说明其通信的过程,但是在此之前,我们还是好好的知道一下原理
计算机通信
是将计算机技术和通信技术的相结合,完成计算机与外部设备或计算机与计算机之间的信息交换-
并行通信
通常是将数据字节的各位用多条数据线同时进行传送
控制简单、传输速度快
由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难
-
串行通信
将数据字节分成一位一位的形式在一条传输线上逐个地传送
传输线少,长距离传送时成本低
且可以利用电话网等现成的设备,但数据的传送控制比并行通信复杂(并串、串并转换)
我们下面主要讲解串行通信
串行通信
包含同步通信和异步通信
- 异步通信
- 是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程
为使双方的收发协调,要求发送和接收设备的时钟尽可能一致 - 以字符(构成的帧)为单位进行传输,字符与字符之间的间隙(时间间隔)是任意的,但每个字符中的各位是以固定的时间传送的,即字符之间不一定有“位间隔”的整数倍的关系,但同一字符内的各位之间的距离均为“位间隔”的整数倍
- 不要求收发双方时钟的严格一致,实现容易,设备开销较小,但每个字符要附加2~3位用于起止位,各帧之间还有间隔,因此传输效率不高
- 同步通信
要建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。
此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙,
即保持位同步关系,也保持字符同步关系
发送方对接收方的同步可以通过两种方法实现
(左为外同步,右为自同步)
- 面向字符的同步格式
传送的数据和控制信息都必须由规定的字符集(如ASCII码)中的字符所组成
- 帧头为1个或2个同步字符SYN(ASCII码为16H)
- SOH为序始字符(ASCII码为01H),表示标题的开始
- 标题中包含源地址、目标地址和路由指示等信息
- STX为文始字符(ASCII码为02H),表示传送的数据块开始
- 数据块是传送的正文内容,由多个字符组成
- 组终字符ETB(ASCII码为17H)或文终字符ETX(ASCII码为03H)
- 校验码
- 面向位的同步格式
将数据块看作数据流,并用序列01111110作为开始和结束标志。为了避免在数据流中出现序列01111110时引起的混乱,发送方总是在其发送的数据流中每出现5个连续的1就插入一个附加的0;接收方则每检测到5个连续的1并且其后有一个0时,就删除该0
信号的调制与解调
利用调制器(Modulator)把数字信号转换成模拟信号,然后送到通信线路上去,再由解调器(Demodulator)把从通信线路上收到的模拟信号转换成数字信号。由于通信是双向的,调制器和解调器合并在一个装置中,这就是调制解调器MODEM
传输速率与传输距离
- 传输速率
比特率是每秒钟传输二进制代码的位数,单位是:位/秒(bps)
如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位、1个停止位、8个数据位),这时的比特率为:
10位×240个/秒 = 2400 bps - 传输距离与传输速率的关系
串行接口或终端直接传送串行信息位流的最大距离与传输速率及传输线的电气特性有关
由于我们的串口通信就是用的RS-232接口,故我们需要知道一些引脚定义
扩展:
远程通信连接
进程通信连接
RS-232C电平与TTL电平转换驱动电路
RS-485接口
RS-485是一种多发送器标准,在通信线路上最多可以使用32 对差分驱动器/接收器。如果在一个网络中连接的设备超过32个,还可以使用中继器。
RS-485的信号传输采用两线间的电压来表示逻辑1和逻辑0。由于发送方需要两根传输线,接收方也需要两根传输线。传输线采用差动信道,所以它的干扰抑制性极好,又因为它的阻抗低,无接地问题,所以传输距离可达1200米,传输速率可达1Mbps。
举例子
串口通信
实验现象
上位机向单片机发送数据:在发送缓冲区显示要发送的数据,按下按键1数据发送到单片机,并在数码管上显示相应的数据;下位机向上位机发送数据:在单片机数码管上显示要发送的数据,可以通过按键2、3进行调整,按下按键1数据发送到上位机,在接受缓冲区显示接收到的数据
实验原理
电路原理图
单片机集成了USB转串口模块,对应使用RXD线接收数据,用TXD发送数据。每个串口由2个数据缓冲器(相互独立1收1发)、一个移位寄存器(一字节数据一位一位发送出去)、一个串行控制器和一个波特率发生器(这个比较重要,结合相关的定时器)组成。
对应发送、接收数据完成(RI、TI硬件置1)都会触发串口中断,但是无法确定是哪个触发的,所以在串口中断中我们要判断是接收数据产生的中断还是发送数据产生的中断,对于发送数据产生的中断,我们要软件将TI清0,并将数据就绪标志清0,允许下一字节数据发送,发送数据函数中通过while循环,等待发送数据准备就绪,完了将就绪的数据复制给SBUF;对于接收数据产生的中断,我们要软件将RI清0,并从SBUF中读取数据(其实这个原理我也不明白,整段都是从老师那里copy过来的,学到后面可能就慢慢知道了趴?)
代码解析
程序设计流程图
-
主函数部分
调用Init函数进行初始化,while(1)循环中,主要是判断按键是否按下,当按下Key1时进行对上位机发送数据,而Key2、Key3调整发送的数据的大小 -
涉及的一些函数
void Timer0() interrupt 1 //定时器0的中断响应函数 void Uart1_Init(void) //初始化串口1的相关设置,设定串口的波特率等 void SendData(unsigned chardat) //发送单个字符给UART1以发送到PC机 void Uart1_fun() interrupt 4using 1 //串口1中断服务程序 void Init() //完成各部分功能模块的初始化
- void Uart1_fun() interrupt 4 using 1 串口中断程序
TI:发送中断标志位,当发送完8位数据后,TI由硬件置位;TI=0,时,可申请中断,也可供软件查询用,在任何方式都必须由软件清除TI;
RI:接收中断标志位,在方式0中,接受完8位数据后,有硬件置位;在其它方式中,在接受停止位的中间,由硬件置位。RI=1时,可申请中断,也可供软件查询用,在任何方式都必须由软件清除RI;
485多机通信
实验现象
将两块带有485模块的51单片机通过485外接引脚A、B连接起来,单片机上电烧写程序后485模块的D/R引脚所对应的二极管均点亮,然后通过按键KEY3、KEY2控制数码管上的数值进行加减处理,两块单片机起始都默认为接收状态,最后按下KEY1发送键,将数据传送给另一块单片机,而此时接收方数码管上的数值发生相应的改变,与发送方数码管上的数值一致
注意:
- RS485属于半双工通信,数据可以在一个信号载体的两个方向上传输,但是不能同时进行传输
- 电平转换采用差分电路方式,A、B两线的电压差大于0.2认为是逻辑“1”,小于-0.2认为是逻辑“0”,方便与TTL电路连接
- 使用RS485进行通信与RS232通信的逻辑是一致的,但RS485抗干扰性更强,传输距离更远
- MAX485芯片的功能是将TTL电平转换为RS485电平
实验原理
电路原理图如下:
引脚功能
-
485 D/R输出、接收信号控制引脚:当该引脚为低电平时,485为接收态,MAX485通过485_RX、D把来自u总线的信号输出给单片机;当该引脚为高电平时,485为发送态,来自485_TXD的输出信号通过A、B引脚加载到总线上
-
485_RXD引脚接收数据,RX1 LED点亮时表示正在接收数据
-
485_TXD引脚发送数据,TX1 LED点亮时表示正在发送数据
-
A、B端口与另一个开发板上的MAX485的A、B连接实现双机通信
使用RS485进行通信的大致步骤为:
-
初始化波特率,设置好串口通信模式
-
发送数据时将数据放入S2BUF,并软件清零S2RI
-
接收数据时从S2BUF读取数据,并软件清零S2TI
而其中涉及的数码管以及按键原理这里就不再阐述了(因为本身也比较简单)
代码解析
设计总流程图
- 一些需要用到的函数
void Uart2Init(void); //串行口初始化函数 void CPUInit(void); //CPU初始化函数,配置相关寄存器和IO口模式 void delay(void); //延时函数 void ser2_int(void) interrupt 8 using 1 //串口中断处理函数 void ex_int0() interrupt 0 //外部中断0处理函数
这个比串口通信相对于简单一点,就不具体分析代码了,就提供一些基本思路
红外测试
实验现象
需要两个电路板,一个电路板用于发送,另一个用于接收。按下KEY1每100毫秒发送红外信号一次。接收方在接收到红外信号后,L0会发光
红外接收头IR_R用于接收红外发光二极管IR_T发出的红外信号,从而达到一个通信的目的。但在自然环境中并非只有红外发光二极管能发出红外线,自然光、日光灯灯光等光线中都含有红外线,故红外接收头需要对红外信号进行区分,把无关信号过滤。
因此,红外接收头被设计为只能接受一定频率范围内的红外线脉冲。例如,当红外发光二极管每隔13us发出一次红外线脉冲,发光时间也为13us,即发出了一个38kHz的红外脉冲信号,而这个信号的频率恰好在接收头的接收范围内,接收头就会接收此红外信号并把这个38kHz的红外信号方波转换成电信号。而自然环境中的红外干扰信号不在接收头的接收频率内,接收头不会接收
实验原理
电路原理图如下:
其中TXD 对应p3.5
RXD对应p3.6-
发送:不断检测KEY1(P3.2引脚)的电平。当KEY1为低电平时,认为按键被按下,每隔一段时间设置一次标志位。定时器T0每13us检测一次标志位,若标志位为0则使P3.5引脚电平不断发生翻转,间歇地发出38kHz红外光。在KEY1没有被按下的时候确保标志位值1,使得P3.5引脚输出低电平。
-
接收:不断检测P3.6引脚的电平。若P3.6输入了低电平,则代表接收到了红外信号,点亮Led灯
代码解析
- 全局变量
int flag = 1; //标记位,标记是否发出送脉冲。0:发送、1:不发送
- 函数:
void Timer0Init() //定时器T0初始化 void Delay() //延时100ms函数 void Timer0() interrupt 1 //定时器0中断:可产生38kHz红外脉冲
-
基于RS485单片机多机串行通信的电子开关的设计
2021-01-19 18:24:54多机串行通信控制网络是物理层采用RS 485通信接口所组成的多机串行通信工控设备网络,RS 485既是物理层的协议标准,也是串行通信接口的电气标准。这种通信接口可以十分方便地将许多设备组成一个控制网络。RS 485通信... -
c#串口调试程序+485多机通信
2010-12-12 21:34:432.压缩文件里包括c#串口调试软件,KEIL程序(计数器),proteus仿真485多机通信。 3.使用上位机软件读取485网的计数器数据,非常好的整套系统程序(适用初学c#,单片机)。 4.需要安装虚拟串口,framework3.5,... -
利用RS-485通讯协议实现PC机与单片机的多点通讯
2020-08-13 02:43:52绍一种RS-485接口芯片MAX485,利用此芯片可以很方便地实现PC机与单片机之间的串行通讯,同时给出PC机与单片机实现多点通讯的实例。 -
stm32实现485通信
2018-11-23 17:28:45基于stm32F103平台,通过串口实现RS485通信,并在串口助手上显示 -
max485多机通信
2009-09-17 16:43:38本文件是C51 编写的 max485多机通信 程序,带有PROTUES 仿真文件 -
RS-485多从机竞争的解决方案
2021-05-22 13:35:12摘要:本文介绍的新方案之一能够识别从机发送信号的时间顺序,先发送的从机信号可以同时抑制其他从机的RS-485发送信号,只有等先发送信号的从机发送完毕之后其它从机才能够发送RS-485信号。本文介绍的新方案之二可以...摘要:本文介绍的新方案之一能够识别从机发送信号的时间顺序,先发送的从机信号可以同时抑制其他从机的RS-485发送信号,只有等先发送信号的从机发送完毕之后其它从机才能够发送RS-485信号。本文介绍的新方案之二可以让下位机能够主动发送自己的地址,这样就无需主机对各从机进行轮流查询。本文介绍的新方案之三是将从机转换为不同的波特率,由于主机每次只能够接收某一种波特率的信号,这样就完全避免了多从机的竞争。本文中的“上位机”即“主机”,“下位机”即“从机”。
版权所有2012
在RS-485多机通信中,往往会出现多个从机同时向主机发送数据。比如在RS-485温度测量系统中,多个RS-485从机的温度测量值只要超过报警点就立即向主机发送报警信息,但是这也可能会出现2个或者2个以上的RS-485从机同时向主机发送报警信息。如果不采取RS-485竞争解决机制,那么就可能会导致2个从机同时发送的信息重叠,这样主机就无法接收到正确的信号,严重的还可能导致整个RS-485系统的崩溃。传统的解决方案是由主机循环轮流对各个RS-485下位机点名通信,这虽然解决了RS-485多从机的竞争,但是同时延误了实时报警信息。本文介绍的新方案之一能够识别从机发送信号的时间顺序,先发送的从机信号可以同时抑制其他从机的RS-485发送信号,只有等先发送信号的从机发送完毕之后其它从机才能够发送RS-485信号。本文介绍的新方案之二可以让下位机能够主动发送自己的地址,这样就无需主机对各从机进行轮流查询。本文介绍的新方案之三是将从机转换为不同的波特率,由于主机每次只能够接收某一种波特率的信号,这样就完全避免了多从机的竞争。本文中的“上位机”即“主机”,“下位机”即“从机”。
1、在RS-485总线中接入RS-485智能共享器
2路RS-485对1路RS-485智能共享器(型号:HUB2485Z)本来是用于两个RS-485上位机共同控制一个RS-485下位机的通信连接,在这里我们将HUB2485Z用于两台下位机的RS-485口共享一台上位机的RS-485口。HUB2485Z使RS-485总线从同时接2个从机。HUB2485Z已经有2个下位机RS-485(1)和RS-485(2)的插座(DB-9针并且配接线端子)和1个上位机的接线端子,无需修改软件、5V供电。HUB2485Z适用于两台下位机的RS-485口同时驱动一台上位机的RS-485口。HUB2485Z的外型为DB-9(针)/ DB-9(针)转接盒大小,其中两个DB-9针的RS-485口均配接线端子。两个DB-9针的下位机RS-485口,如图RS-485(1)和RS-485(2)是完全一样的,可以互换。上位机RS-485为接线端子,位于如图产品的上侧面,与电源接线端子在一起。HUB2485Z需要外接5V电源,配套提供。
图1 RS-485智能共享器外形图
波仕HUB2485Z智能RS-485集线器能够识别两个下位机RS-485(1)和RS-485(2)的发送顺序,避免同时发送导致的系统瘫痪。也就是说,即使两个下位机正在同时发送,HUB2485Z会选取发送开始时间领先的下位机正确发送数据,而只有等到这一个下位机的数据发送完毕后,另外一个下位机才可以开始发送数据。HUB2485Z的具有双向通信功能,当上位机发送时,两个下位机同时接收到相同的数据,并不区分地址。
图2 RS-485智能共享器使用布线图
在图2中,举例说明了同时接4个RS-485下位机的布线图,实际上还可以一直继续接下去。以接4个下位机为例,下位机4和下位机3分别接入3号HUB2485Z的RS-485(1)和RS-485(2)口,共享的RS-485口再级联接入另外一个2号HUB2485Z的RS-485(2)口,2号HUB2485Z的RS-485(1)接下位机2。以此类推,2号HUB2485Z的RS-485(2)口接下位机2,共享的RS-485接到1号HUB2485Z的RS-485(2),1号HUB2485Z的RS-485(1)接下位机1。在这样的布线结构中,每一个下位机都接入到了HUB2485Z共享器,由于HUB2485Z是可以级联的,所以非常灵活地接入多个下位机。实际上,1号HUB2485Z的RS-485(1)也可以继续级联新的HUB2485Z。
2、在RS-485总线中接入RS-485地址转换器
传统的RS-485多机通信方案是每次都由主机循环轮流对各个RS-485下位机点名通信,主机先发送被呼叫的从机的地址,总线中每一个从机都将这个地址信号与自己的地址进行比较,地址一样就继续也主机通信,不一样就不与主机通信。这样可能存在的问题就是从机发送的信号是可以不带本从机地址的,因为主机已经发送了从机地址信息,紧接着收到的从机信号一定就是这个被点名的从机的信号,而且从机信号不带地址可以极大简化主机的信号处理程序。从机发送的信号不带从机地址就会限制RS-485多机通信的实时性,比如RS-485多机温度测量系统就不能够实时报警,因为主机不知道发送报警信号的从机的地址。
图3 为RS-485下位机加上地址
波仕电子的DIZ485地址串口转换器用于实现串口(同时支持RS-232和RS-485)之间的带地址的转换。通过跳线设置地址编码,DIZ485可以将串口接收到的数据附加上地址编码发送出去,也可以将带地址编码的串口数据送到对应地址的转换器的串口。 DIZ485与其它同类产品相比的特点是可以识别下位机的地址、下位机可以主动发送带地址的数据。 波仕DIZ485地址串口转换器的外形为DB-9/DB-9转接盒大小,如图,产品左边为主串口,包括DB-9孔的RS-232口,和标明为A1、B1的RS-485口。右边为从串口,包括DB-9针的RS-232口,和标明为A2、B2的RS-485口。左上侧J2、J1、J0为波特率设置的跳线,右上侧K2、K1、K0为地址编码设置的跳线,下面中间为5V电源接线端子。
DIZ485使用非常方便。首先根据波特率进行波特率跳线设置,然后跳线设置本产品的地址。通信规则:主串口数据=地址码 从串口数据 如果主串口收到 ###1:1234567,那么地址为1的产品的从串口发送出 1234567(地址不是1的产品的从串口不发送任何数据),就是去帧头。地址码就是在K2、K1、K0跳线设置值的前面加3个井号(###)和后面加一个冒号(:)的英文字符。如果地址为1的产品的从串口收到abcdefg ,则主串口发送出###1:abcdefg 就是加帧头。
加入RS-485地址转换器可以使得RS-485从机可以随时主动向上位机发送消息,因为信号中自动加上了从机地址信息,这样主机就可以识别下位机。
3、在RS-485总线中接入串口波特率转换器
RS-485多机通信,本来是要求通信的双方波特率等通信格式一样才可以通信成功。可是为了解决在这种情况下出现RS-485多从机竞争的问题,波仕电子在世界上首次提出了一种多波特率的多机通信方式。本来是相同波特率的RS-485从机设备,我们人为地将从机进行串口波特率的转换。当多个从机都转换为不同的波特率后,由于每个RS-485从机发送信号的波特率不同,而主机同一时间只能够收到某一种波特率的信号,这样就自然避免了多从机同时发送的竞争问题。本节介绍如何实现串口波特率的转换。
串口波特率转换器用于实现不同波特率的RS-485/RS-232口的通信转换,纯硬件跳线设置,无需任何软件设置。串口波特率转换器的外形为DB-9/DB-9转接盒大小,如图4。串口波特率转换器的内部有一个带双串口的单片机。单片机自动完成两个串口之间的数据交换。单片机程序用C语言编写,核心功能就是先将两个串口UART1和UART2根据跳线设置的状态进行波特率等初始化设置,然后随时将UART1接收的数据立即送到UART2的发送区、以及将UART2接收的数据立即送到UART1的发送区。
图4 RS-485/RS-232波特率转换器
上位机串口A的波特率通过产品的J2、J1、J0来设置,下位机串口B的波特率通过产品的K2、K1、K0来设置,见表格。波特率转换器的两边的串口可以分别独立设置波特率,见下表。DB-9孔RS-232口波特率设置DB-9针RS-232口波特率设置
J2J1J0波特率K2K1K0波特率
00012000001200
00124000012400
01048000104800
01196000119600
1001920010019200
1013840010138400
1105760011057600
111115200111115200
由串口波特率转换器实现的RS-485多机通信图与图3所示的“为RS-485下位机加上地址”的布线结构完全相同。由于每次主机通信程序只能够设置为某一种波特率,所以也就每次只能给与某一个从机进行通信,其它从机即使同时发送信号但由于波特率不一样所以也不会对主机产生影响。这种方案的优点之一在于完全无竞争,缺点是最多8个下位机,因为这种串口波特率转换器只能够提供8种不同的波特率。这种方案的优点之二在于如果用户自己可以修改从机的波特率,那么可以实现零成本的解决方案。
本文介绍的3种解决RS-485多从机竞争的方案可以形象地称为抢答、报名和调频。这3种方案各有特色,也各有局限性,但是互不排斥。也就是说,这3种方案还可以组合使用。
-
用RS-485设计的多机通信接口电路
2021-07-16 03:29:05利用RS-485总线建立的多机通信网,具有可靠性高、硬件设计简单、控制方便、成本低廉等优点,它与计算机之间的通信可以采用多级分级通信模式,可方便地建立起设备网络。一、多机通信网原理图利用RS-485总线建立的多机...利用RS-485总线建立的多机通信网,具有可靠性高、硬件设计简单、控制方便、成本低廉等优点,它与计算机之间的通信可以采用多级分级通信模式,可方便地建立起设备网络。
一、多机通信网原理图
利用RS-485总线建立的多机通信网原理图如下图所示。
PC机与从机的通信采用异步串行通信。在串行数据通信中采用了RS-485转换接口,利用RS-232/RS-485转换接口进行电平转换。
二、RS-485接口电路硬件设计
常用的RS-485总线驱动芯片有SN75174、SN75175、SN75176。SN75176芯片有一个发送器和一个接收器,非常适合作为RS-485总线驱动芯片。现以89C52单片机自带的异步通信口,外接75176芯片转换成485总线为例,对RS-485接口电路设计作简要的介绍,其原理图如下图所示。
在接口电路设计中我们注意了以下三个问题。
1.为了实现RS-485总线与单片机系统的隔离,在89C52的异步通信口与75176之间采用光耦隔离。电路设计中采用了高速光耦6N136芯片。
2.在电路设计时,应保证系统上电复位时75176的DE端电位为“0”,否则485总线输出将会处于发送状态,也就是占用了通信总线,这样其它的分机就无法与主机进行通信。由于89C52在复位期间,I/O口输出高电平,故图2电路采用与非门的接法有效地解决复位期间分机“咬”总线的问题。
3.为防止总线中其它分机的通信受到影响,在75176的485信号输出端串联了两个20Ω的电阻R20、R21。
这样本机的硬件故障就不会使整个总线的通信受到影响。
-
rs485多机通信 Proteus
2009-04-23 15:35:42rs485多机通信,基于Proteus的,很生动详细,,看了就明白 -
单片机RS-485多机通讯的实现
2020-08-02 02:14:13本文介绍一种能利用RS-485电气特性和简单的结构方式,采用自定义串行通信协议,实现单片机RS-485多机通讯的方法和技巧。 -
主从式51单片机多机通信系统设计
2021-01-19 18:13:08片机构成的多机通信系统中常采用总线型主从式结构。在多个单片机组成的系统中,只允许存在一个主机,其他的就是从机,从机要服从主机的控制,这就是总线型主从式结构。 当 51 单片机进行多机通信时,串口要工作在... -
单片机485多机通信
2009-03-19 22:31:06单片机多机通信,采用485多机通信方式··· -
主从机485通信协议
2020-08-19 04:51:21为了适应主从机通信处理,特暂定本协议,目前暂定三种通信协议 -
ATMEGAL64的485多机通信
2010-07-19 10:07:41本资料是基于ATMEGA64的485多机通信,很详尽的485设置还有不同的通信写法等 -
485多机通信例程,很好用,适当修改可做单机使用
2012-08-29 11:53:02485多机通信例程,很好用,适当修改可做单机使用