RS485通讯实验
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)第⼀章绪论所谓通信,不仅仅要实现数据的传输,更应该体现准确性,也称可靠性传输,最好具有⼀定的纠错和检错能⼒。
威纶触摸屏与CP1H通过RS485通信教学内容

关于威纶屏与欧姆龙PLC 的485通信试验一.试验目的:了解威纶通触摸屏与OMRON的CP1H系列PLC的485通信试验其中触摸屏做主站,两个PLC做从站。
二.材料:1.威纶通触摸屏型号MT6100I (软件EB8000)2.OMRON的PLC型号:CP1H-XA40DT-D 2个(软件CX-Programmer)3.PLC附件CP1W-CIF11 2个。
4.开关电源直流24V开关电源一个5.电线若干。
三.接线按求接好电线,触摸屏电源为24VDC;PLC电源为24VDC;通讯线在屏的COM1通信口(D型9針)需要注意的是MT61OOI屏有两个COM1通信口(一个为RS485 2/4W母头,一个为rs232公头)我们选择前者。
打开EB8000软件查看帮助中通信线的制作。
2号脚和1号脚分别为RX+和RX-,RX+连接到2个CP1W-CIF11通信口的SDB+或RDB+;RX-连接CP1W-CIF11通信口的SDB-或RDB-。
四.CP1W-CIF11的设置:把CP1W-CIF11上的拨码开关的1、2、3、5、6号脚打到ON的位置。
五.PLC设置:其中模式应选择Host link, 波特率,通信位数,停止位,校验方式等应与触摸屏设置一致。
单元号即为站号。
两个PLC设置不能一样。
我这里一个为1,一个为2。
(因为PLC有两个通信端口,所以设置时应视选择的端口来设置串口1还是串口2)。
六.PLC程序,因为是试验,所以写了一个简单的启动与停止程序。
程序写好后下载到PLC中在下载时一定要记得把设置也下载到PLC中,完成后把PLC断电重启,七.触摸屏程序:打开编程软件EB8000,新建一个文件,在系统参数设置中新增一个设备(多个PLC在同一485网络下不要多次新增设备,否则会报COM1端口已被占用。
),在PLC类型中选择OMRON CJ/CS/CP ;接口类型中选择RS485 2W;COM设置见下图,设置完成后点确定.然后在屏幕创建四个位元件.请注意,在地址栏中一个为W1#0.00,一个为W2#0.00分别对应站号为1的PLC的W0.00位和站号为2的PLC的W0.00位依次建立四个按键分别为第一个PLC启动,第一个PLC停止,第二个PLC启动,第二个PLC停止,完成后保存再编译,然后下载到触摸中.八.实验:有触摸屏上按下第一个PLC启动,电脑监控第一个PLC程序发现W1.00有输出,按下第一个PLC停止,W1.00停止输出.然后监控第二个PLC程序,程序运行正确.至此,实验完成了一个触摸屏与两个PLC之间的485通讯完全正确.可以正常使用.。
监控摄像机RS485总线现场实际应用

监控摄像机RS485总线现场实际应用一、关于监控摄像机RS485总线的几个概念1、RS485总线的通讯距离呆以达到1200米根据485总线结构理论和标准,在理想环境的前提下,485总线传输距离可以达到1200米。
其条件是通讯线材优质达标,波特率为9600,只负载一台485设备,才能使得通讯距离达到1200米,所以通常485总线实际的稳定的通讯距离往往达不到1200米。
如果负载485设备多,线材阻抗不合乎标准,线径过细,转换器品质不良,设备防雷保护复杂和波特率的提高等等因素都有会降低通讯距离。
2、监控摄像机485总线可以带128台设备进行通讯其实并不是所有485转换器都能够128台设备的,要根据485转换器内芯片的型号和485设备芯片的型号来判断,只能按照指标较低的芯片来确定其负载能力。
一般485芯片负载能力有三个级别——32台、128台和蔼56台。
此外理论上的标称往往实际上是达不到的,通讯距离越长、波特率越高、线径越细、线材质量越差、转换器品质越差、转换器品质越差、转换器电能供应不足(无源转换器)、防雷保护越强,这些都会降低真实负载数量3、485总线是一种最简单、最稳定、最成熟的工业总线结构这种概念是错误的。
485总线是一种用于设备联网的、经济型的、传统的工业总线方式。
其通讯质量需要根据施工经验进行调试和测试采可以得到保证。
485总线虽然简单,但也必须严格按照安装施工规范进行布线。
二、必须严格按照施工规范施工在485总线系统施工时必须严格按照施工规范施工,特别应注意下面几点:1、485+和485-数据线一定要互为双绞。
2、布线一定要布多股屏蔽双绞线。
多股是为了备用,屏蔽是为了便于出现特殊情况时调试,双绞是因为485通讯采用差模通讯原理,双绞的抗干扰性较好。
不采用双绞线是错误的。
3、485总线一定要是手牵手式的总线结构,坚决杜绝星型连接和分叉连接。
4、设备供电的交流电及机箱一定要真实接地,而且接地良好。
基于STM32的485通讯实验(f103)

基于STM32的485通讯实验(f103)1.前⾔-单⽚机的通讯在单⽚机通讯⽅式多种多样的今天,基本可以划分为两类,即同步和异步通信。
单⽚机要正常交流(即交换数据和读写命令)离不开通讯,单⽚机之间或者单⽚机与及外设之间的通讯都离不开这两类通讯。
通讯⽅式的分类同步和异步通信怎么区别?带时钟同步信号传输的是同步传输,不带时钟同步信号的是异步传输(此时要求通讯双⽅同波特率)。
下⾯我将通过基于stm32f103芯⽚以及MDK5软件进⾏开发485通讯实验(其实485通讯就是利⽤uart串⼝实现的),需要准备:⼀台装着MDK5软件的电脑ST-LInk烧录器,STM32正点原⼦精英开发板2套(包含TFTLCD显⽰屏)两根杜邦线2.485通讯简介要开展485通讯实验之前,485得对⾃⼰进⾏⼀次⾃我介绍。
485通讯本质上是通过串⼝经过485芯⽚改变电压与及阻抗,内在的信息没有改变,之后通过电压电流等信号传给另⼀个单⽚机的485芯⽚,该芯⽚接⾄该单⽚进的串⼝。
485(⼀般称作RS485/EIA-485)是⾪属于OSI模型物理层的电⽓特性规定为2线,半双⼯,多点通信的标准。
它的电⽓特性和RS-232⼤不⼀样。
⽤缆线两端的电压差值来表⽰传递信号。
RS485仅仅规定了接受端和发送端的电⽓特性。
它没有规定或推荐任何数据协议。
RS485的特点包括:1)接⼝电平低,不易损坏芯⽚。
RS485的电⽓特性:逻辑“1”以两线间的电压差为+(2~6)V表⽰;逻辑“0”以两线间的电压差为-(2~6)V表⽰。
接⼝信号电平⽐RS232降低了,不易损坏接⼝电路的芯⽚,且该电平与TTL电平兼容,可⽅便与TTL 电路连接。
2)传输速率⾼。
10⽶时,RS485的数据最⾼传输速率可达35Mbps,在1200m时,传输速度可达100Kbps。
3)抗⼲扰能⼒强。
RS485接⼝是采⽤平衡驱动器和差分接收器的组合,抗共模⼲扰能⼒增强,即抗噪声⼲扰性好。
4)传输距离远,⽀持节点多。
RS485实验一报告模板

实验一基于RS485和牛顿模块的A/D、D/A实验一、实验目的和要求(1)熟悉RS485总线与牛顿模块的结构组成,了解其工作过程,认识其结构形式。
(2)熟悉牛顿模块的基本工作原理。
(3)掌握应用RS485和牛顿模块进行电压输出和电压采集的方法。
二、主要仪器设备计算机、R-8017、R-8024、R-8043D、R-8053、RS232转RS485模块、24V稳压源三、实验内容和原理(1)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. 引言RS485是一种串行通信协议,用于在多个设备之间进行双向数据传输。
它是一种高性能的通讯协议,常用于工业自动化、仪器仪表、门禁系统等领域。
本文将介绍RS485通讯的基本原理、使用方法以及常见的应用场景。
2. 基本原理RS485通讯使用差分信号传输,可以抵抗电磁干扰和噪声。
它采用两条相对独立的传输线(A线和B线),通过不同的电平表示逻辑1或逻辑0。
其中,逻辑1对应线A为高电平,线B为低电平;逻辑0对应线A为低电平,线B为高电平。
通过这种方式,数据可以在多个设备之间进行可靠的传输。
3. 硬件连接在使用RS485通讯时,需要将所有设备连接到一个共享的总线上。
每个设备都需要两条连接线(A线和B线)以及一个共享的地线。
通常,可以使用终端电阻来匹配总线阻抗并提高信号质量。
4. 传输方式RS485通讯可以采用两种传输方式:全双工和半双工。
4.1 全双工通讯在全双工通讯中,设备可以同时发送和接收数据。
发送数据的设备需要将数据发送到总线上,并通过差分信号传输给其他设备。
同时,接收数据的设备可以监听总线上的数据并将其解析。
4.2 半双工通讯在半双工通讯中,设备的发送和接收操作是交替进行的。
设备在发送数据时,需要先将总线设置为发送模式,并将数据发送到总线上。
其他设备在接收数据时,将总线设置为接收模式,并监听数据。
5. 通讯协议RS485通讯可以使用多种协议进行数据交换,常见的有MODBUS、DMX512等。
这些协议定义了数据的传输格式、通讯方式和功能码等。
5.1 MODBUS协议MODBUS是一种常用的通讯协议,适用于工业自动化领域。
它定义了数据的传输格式,并提供了读写寄存器等功能。
MODBUS协议支持点对点和多点通讯。
5.2 DMX512协议DMX512是一种用于舞台灯光控制的通讯协议。
它定义了数据的传输格式和通讯方式。
DMX512通讯一般采用全双工方式进行。
6. 应用场景RS485通讯在许多领域都有广泛的应用。
PLC资料:三菱PLC RS485通讯使用教程(带示例)

通信
一、联机方式
自动化生产线各工作站中PLC之间通过RS-485串行通信的方式实现互连,构成分布式的控制系统。
二、N:N网络功能
N:N网络功能,就是在最多8台FX可编程控制器之间,通过RS-485通信连接,进行软元件相互连接。
1)根据要链接的点数,有3种模式可以选择。
2)数据的链接是在最多8台FX可编程控制器之间自动更新。
3)总延长距离最大可达500m。
三、链接模式及链接点数
四、N:N网络接线图
五、N:N网络中使用的软元件如下:
1.N:N网络设定用的软元件
是用于设定N:N网络的软元件。
使用N:N网络时,必须设定下列的软元件。
2.判断N:N网络错误用的元件
用于判断N:N网络错误。
请将链接错误输出到外部,并在顺控程序的互锁等中使用。
3. 链接软元件
是用于发送接收各可编程控制器之间的信息的软元件。
根据在相应站号设定中设定的站号,以及在刷新范围设
定中设定的模式不同,使用的软元件编号及点数也有所不同。
1)模式0时
2) 模式1时
3) 模式2时
三菱PLC 485通讯示例(2个PLC)
题目:
按下SB1(0#PLC 的X0),灯L1(1#PLC 的Y0)亮。
按下SB2(1#PLC 的X1),灯L2(0#PLC 的Y1)亮。
通讯线连接方式:
主站程序:
从站程序:。
RS485通讯测试

WindowsXP/2000下RS485通讯测试程序此测试程序为WindowsXP/2000下的测试工具。
操作说明:1. 把COM1,COM2的设置成RS485, 。
2. 用短接线把的COM1,COM2连接好,即COM1的5/7与COM2的5/7直接连接。
3. 进入系统, 运行RS485Test.exe。
4. 选择要测试的COM口, 工作模式,CHANGE COM MODE:SEND OR READ(S OR R)在这里选择是要发送还是接收。
回车5. 如果COM1,COM2出现相应的字符既表示这2个串口工作正常。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "Serial.h"//RS485 测试程序 int RS485Test() { unsigned int unComNum1 = 0; // unsigned int unComNum2 = 0; unsig ned char ucCom1Mod = 0; unsigned char ucCom2Mod = 0; char chCom[5] = {0}; CSerial seri al1; CSerial serial2; char buffer[1024] = {0}; long lSendCounter = 0; char szSendBuff[1024] = {0}; DWORD dwRead = 0; int i = 0; //==================输入COM1的端口号和工作模式===========================// fprintf(stdout, "\nEnter COM1 Number (1,2) : "); // scanf("%d", &unComNum1); unComNum1 = 1;fprintf(stdout, "Change COM1 mode: Send or Read(s or r) : "); scanf("%s", &ucCom1Mod); memset(chCom, 0, 5);sprintf(chCom, "COM%d", unComNum1);BOOL bSer = serial1.InitCOM(chCom, 19200, 8, 0, 0, 1); if (!bSer) { fprintf(stdout, "Can't Ini tCOM Com1.\n"); return -1; }//==================输入COM2的端口号和工作模式===========================// fprintf(stdout, "\nEnter COM2 Number (1, 2) : "); // scanf("%d", &unComNum2); unComNu m2 = 2;fprintf(stdout, "Change COM2 mode: Send or Read(s or r) : "); scanf("%s", &ucCom2Mod); memset(chCom, 0, 5);sprintf(chCom, "COM%d", unComNum2);bSer = serial2.InitCOM(chCom, 19200, 8, 0, 0, 1); if (!bSer) { fprintf(stdout, "Can't InitCOM Com2.\n"); return -1; }fprintf(stdout, "Input Send data : "); scanf("%s", szSendBuff);for(int k = 0; k < 10; k++) { if( (ucCom1Mod=='s') || (ucCom1Mod=='S') ) { serial1.SendDa ta(szSendBuff, strlen(szSendBuff));} if( (ucCom2Mod=='s') || (ucCom2Mod=='S') ) { serial2.SendData(szSendBuff, strlen(szSe ndBuff)); } Sleep(100); if( (ucCom1Mod=='r') || (ucCom1Mod=='R') ) { memset(buff er, 0, sizeof(buffer)); dwRead = serial1.ReadData(buffer, sizeof(buffer)); printf("COM1 k=%d, Receive DataLen=%d, Data(HEX): ", k, dwRead); for(i = 0; i < dwRead; i++) { printf("%x ,", buffer[i]); } printf("\n"); } if( (ucCom2Mod=='r') || (ucCom2Mod=='R') ) { memset(buffer, 0, sizeof(buffer)); dwRead = serial2.ReadData(buffer, sizeof(buffer)); printf("COM2 k =%d, Receive DataLen=%d, Data(HEX): ", k, dwRead); for(i = 0; i < dwRead; i++) { print f("%x,", buffer[i]); } printf("\n"); } } serial1.Close(); serial2.Close(); return 0; }int main(int argc, char **argv){ RS485Test(); return 0;}// Serial.cpp: implementation of the CSerial class. //////////////////////////////////////////////////////////////////////// //#include <winioctl.h> #include <stdio.h> #incl ude <conio.h> #include <stdlib.h>#include "Serial.h"////////////////////////////////////////////////////////////////////// // Construction/Destruction//////////////////////////////////////////////////////////////////////CSerial::CSerial() {memset(&m_OverlappedRead, 0, sizeof( OVERLAPPED)); memset(&m_OverlappedWrite, 0, s izeof( OVERLAPPED)); m_hIDComDev = NULL; fWaitingOnRead = FALSE; } CSerial::~CSerial() {Close(); }/************************************************************************RS-485通讯说明由于RS-485是半双工通信,故同一时刻只能发送或接收。
STM32之RS485通讯方式实现

STM32之RS485通讯方式实现
在远距离通讯中,难免受干扰,因此,伟大的牛人们就创造了一种差分传输的方式RS485通讯方式(以下简称RS485)。
RS485由两根差分线来传输数据,比起RS232来说,其传输的距离更远,搞干扰性更强。
当然,也为了节省银子,因此,只保留了一组差分线,也就只能完成同一时刻只接收或发送数据的半双工通讯了。
在设计中,我们经常使用一个名为Max485的芯片来完成TTL电平至差分电平的转换,这款芯片有一个DE(发送使能)引脚控制着RS485线的数据传输方向,而这个引脚何时高电平,何时低电平对我们的数据交换质量也就起着重大的作用。
我们先来看一下DE引脚的作用。
当主设备完成发送后,其需要在1byte的时间内释放RS485总线,否则从设备在收到数据后,再回送数据时就会与主设备对总线占用的问题而产生冲突,这在RS485总线上是不允许的RS485总线没有仲裁机制。
因此,DE引脚就需要在主设备发送完成最后一个字节的最后一位数据的一位时间内将DE引脚从高电平拉到低电平。
STM32微处理器提供一个应用实例来实现精确、高效地控制DE引脚。
这里我们使用DMA 方式通过UART发送与接收数据,那么我们将会用到DMA发送完成中断与USART发送完成中断。
DMA控制器监控着整个发送过程,待发送数据将会不断地被存入USART数据寄存器直到DMA计数减至零。
当DMA发送完成后将触发DMA发送完成中断,我们就在这个中断中,将DE引脚的电平拉低。
RS485通讯

精通RS485通讯系列教程一、通讯基础知识1.1什么是通讯要搞清楚RS485通讯我们要先搞明白什么是通讯,通讯就是两个设备之间0、1代码的传递,0-低电平1-高电平。
举例:A设备向B设备传递数据,首先A设备和B设备之间必须通过电缆连接(硬件连接)。
如果A设备要向B设备发送101010这样一串代码,那么A设备就要在他的通讯端口产生如下图所示的高低电平的组合,通过电缆这个介质B设备的通讯端口就会接收到A设备发出高低电平的组合,同时就会将接收到的高低电平组合翻译成101010,这就完成了A设备向B设备数据的传递,B 设备向A设备数据传递也是同样的道理。
与通讯有个的概念。
【全双工与半双工】全双工是通讯端口在发送数据的同时可以接收数据。
而半双工指的是同一时刻通讯端口要么只能发送数据,要么只能接收数据。
举例:全双工-打电话时双方都可以说。
半双工:对讲机-同一时刻只能一个人说另一个人听。
【通讯速率】通讯速率也叫通讯波特率是1S内通讯端口发送01代码(或者说是高低电平)的数量。
举例:我们说通讯速率是9.6kbps,就表示通讯端口每秒发送9600个bit的数据,也就是每秒可以产生9600个高低电平(注意:是高低电平总共加起来9600个)。
【主从通讯】是在一个通讯网络中一个站点是主站,其他站点作为从站。
主站和从站之间可以直接进行数据的传递,但是从站与从站之间不能直接进行数据的传递。
如果需要从站之间交换数据也必须要通过主站进行转发。
如下图所示1.2、485通讯定义明白了通讯的基本概念后再理解485通讯就相对容易了,下面我们从通讯介质、通讯方式、通讯类型、物理层四个方面来介绍485通讯。
通讯介质:屏蔽双绞线,也就是我们通常用的带有屏蔽层的两心电缆如下图所示。
通讯方式:半双工通讯类型:主从通讯物理层:9针接口,需要注意的是通常情况下485通讯的9针接口,只需要将两芯电缆接到3号脚和8号脚上,3是信号“﹢”,8是信号“-”。
RS-485的多机通信方案

76 Microcontrollers &Embedded Systems 2012年第10期www.mesnet.com.cn RS 485的多机通信方案探究魏金文,马维华,吴侨(南京航空航天大学计算机科学与技术学院,南京210016)引 言在嵌入式系统中,多个孤立节点之间的通信越来越重要,尤其是物联网时代的到来,多节点间通信已经成为必不可少的功能。
由此出现了许多通信手段,如RS 232、RS 485、CAN总线、ZigBee等,综合考虑性能和成本,RS485通信无疑是性价比最高的通信方式。
因此探究高效、实用的多机通信方案具有重大的意义。
1 系统框图RS 485多机通信结构图如图1所示。
若干个RS485节点通过总线连接,由网关节点轮询访问索要数据,每个网关节点可以动态地配置IP地址,以便上位机可以通过以太网控制网关节点,从而获得每个RS 485终端节点的数据。
图1中C节点为控制节点,具有RS 485通信功能,T节点为网关节点,除了RS 485功能外,还具有以太网功能,其作用就是将C节点的数据通过以太网功能传送给上位机。
图1 RS 485多机通信结构图2 硬件设计本文采用新唐科技公司的Cortex M054探究RS485多机通信协议。
Cortex M054有两个UART,均可以配置成RS 485模式,此时Cortex M054通过RTSX引脚自动控制RS 485通信方向。
RS 485通过差分传输,A和B两根信号线铰链在一起来抵消各自的干扰。
当A、B信号的电压差大于200mV时,视为逻辑1;当B、A信号的电压差大于200mV时,视为逻辑0。
RS 485硬件原理图如图2所示。
整套RS 485电路独立供电,通过光电耦合器TLP781B+,与系统其他部件分开,以此来隔离干扰。
和CAN总线相同,在机群的两端(第一个节点和最后一个节点),必须加上匹配电阻,吸收反射信号,大小为75Ω左右。
中间节点则不需要如此,因此留出了R1的位置,当节点位于机群两端的时候,则焊接上R1,这种方式大大地增强了电路的灵活性。
威纶触摸屏与CP1H通过RS485通信

关于威纶屏与欧姆龙PLC的485通信试验一.试验目的:了解威纶通触摸屏与OMRON的CP1H系列PLC的485通信试验其中触摸屏做主站,两个PLC做从站。
二.材料:1.威纶通触摸屏型号MT6100I(软件EB8000)2.OMRON的PLC型号:CP1H-XA40DT-D2个(软件CX-Programmer)3.PLC附件CP1W-CIF112个。
4.开关电源直流24V开关电源一个5.电线若干。
三.接线按求接好电线,触摸屏电源为24VDC;PLC电源为24VDC;通讯线在屏的COM1通信口(D型9针)需要注意的是MT61OOI屏有两个COM1通信口(一个为RS4852/4W母头,一个为rs232公头)我们选择前者。
打开EB8000软件查看帮助中通信线的制作。
2号脚和1号脚分别为RX+和RX-,RX+连接到2个CP1W-CIF11通信口的SDB+或RDB+;RX-连接CP1W-CIF11通信口的SDB-或RDB-。
四.CP1W-CIF11的设置:把CP1W-CIF11上的拨码开关的1、2、3、5、6号脚打到ON的位置。
五.PLC设置:其中模式应选择Hostlink,波特率,通信位数,停止位,校验方式等应与触摸屏设置一致。
单元号即为站号。
两个PLC设置不能一样。
我这里一个为1,一个为2。
(因为PLC有两个通信端口,所以设置时应视选择的端口来设置串口1还是串口2)。
六.PLC程序,因为是试验,所以写了一个简单的启动与停止程序。
程序写好后下载到PLC中在下载时一定要记得把设置也下载到PLC中,完成后把PLC断电重启,七.触摸屏程序:打开编程软件EB8000,新建一个文件,在系统参数设置中新增一个设备(多个PLC在同一485网络下不要多次新增设备,否则会报COM1端口已被占用。
),在PLC类型中选择OMRONCJ/CS/CP;接口类型中选择RS4852W;COM设置见下图,设置完成后点确定.然后在屏幕创建四个位元件.请注意,在地址栏中一个为W1#0.00,一个为W2#0.00分别对应站号为1的PLC的W0.00位和站号为2的PLC 的W0.00位依次建立四个按键分别为第一个PLC启动,第一个PLC停止,第二个PLC启动,第二个PLC停止,完成后保存再编译,然后下载到触摸中.八.实验:有触摸屏上按下第一个PLC启动,电脑监控第一个PLC程序发现W1.00有输出,按下第一个PLC停止,W1.00停止输出.然后监控第二个PLC程序,程序运行正确.至此,实验完成了一个触摸屏与两个PLC之间的485通讯完全正确.可以正常使用.。
威纶触摸屏与CP1H通过RS485通信

关于威纶屏与欧姆龙PLC 的485通信试验一.试验目的:了解威纶通触摸屏与OMRON的CP1H系列PLC的485通信试验其中触摸屏做主站,两个PLC做从站。
二.材料: 1.威纶通触摸屏型号MT6100I (软件EB8000)2.OMRON的PLC型号:CP1H-XA40DT-D 2个(软件CX—Programmer)3。
PLC附件 CP1W—CIF11 2个。
4。
开关电源直流24V开关电源一个5.电线若干。
三.接线按求接好电线,触摸屏电源为24VDC;PLC电源为24VDC;通讯线在屏的COM1通信口(D型9針)需要注意的是MT61OOI屏有两个COM1通信口(一个为RS485 2/4W母头,一个为rs232公头)我们选择前者。
打开EB8000软件查看帮助中通信线的制作.2号脚和1号脚分别为RX+和RX—,RX+连接到2个CP1W—CIF11通信口的SDB+或RDB+;RX-连接CP1W—CIF11通信口的SDB—或RDB—.四。
CP1W—CIF11的设置:把CP1W-CIF11上的拨码开关的1、2、3、5、6号脚打到ON的位置。
五.PLC设置:其中模式应选择Host link, 波特率,通信位数,停止位,校验方式等应与触摸屏设置一致。
单元号即为站号。
两个PLC设置不能一样。
我这里一个为1,一个为2。
(因为PLC有两个通信端口,所以设置时应视选择的端口来设置串口1还是串口2)。
六.PLC程序,因为是试验,所以写了一个简单的启动与停止程序。
程序写好后下载到PLC中在下载时一定要记得把设置也下载到PLC中,完成后把PLC断电重启,七.触摸屏程序:打开编程软件EB8000,新建一个文件,在系统参数设置中新增一个设备(多个PLC在同一485网络下不要多次新增设备,否则会报COM1端口已被占用.),在PLC类型中选择OMRON CJ/CS/CP ;接口类型中选择 RS485 2W;COM设置见下图,设置完成后点确定.然后在屏幕创建四个位元件.请注意,在地址栏中一个为W1#0.00,一个为W2#0。
2W-RS485通讯问题探究

2W-RS485通讯问题探究观察《异常报文》可知:其均为INV_N(N≠0)的ACK回复与INV_0的FER回复的混杂体!据此经进一步分析可知,这是由于上位机对INV_N进行控制操作时;INV_0“偷听了它们之间的对话”,并侦测到了FER错误,所以才会出现FER回复。
如此以来,关键点便集中在了:为何偏偏只有INV_0才报FER,其它INV却无此反映。
为了说明这个问题,现随意抽取《异常报文》中的一条上位机报文加以分析之:05 30 32 46 41 30 30 30 30 32 44 42 0Drbuf[0] → rbuf[recei_index] → rbuf[12]1. 经分析可知,侦测到FER错误的INV实际上是随机的INV_M(代表多台INV)侦测到FER的几种情形:1) recei_index <= 1 时侦测到FER此时仅可能收到rbuf[0]=0x05,而站号存储单元rbuf[1]和rbuf[2]则为空;所以也只可能INV_0作出FER回复。
2) recei_index = 2 时侦测到FER此时业已收到站号的MSB,而其LSB单元rbuf[2]仍为空;所以站号为0x00、0x10、0x20、0x30、0x40、0x50(设站号最高为80)的INV必将作出FER回复。
3) recei_index > 2 时侦测到FER- 倘若在recei_index <= 2时,未曾侦测到过FER及其它接收错误那么也只有M=2,即INV_2在侦测到FER错误时,才会回复FER;注:如果在此前已经侦测到过一次接收错误,那么就SSINVC0.05_V而言则极有可能仅INV_0能报错;注:在INV_2未能侦测到,而INV_M却侦测到了接收错误,并且可以作出应答的情况下,将会出现ACK与NAK应答码叠加的情况。
2. 应答码的叠加1) 正常的ACK应答码CH2:驱动器之正相输出端,CH3:驱动器之反相输出端,M:CH2-CH3之信号(即MCU获得之报文)鉴于此时通讯速率为9600bps,所以可得报文为:0,0110,0000,1 0,0000,1100,1 0,0100,1100,1 0,1011,0000,16 0 0 3 2 3 D 0即:0x06、0x30、0x32、0x0D。
逻辑分析仪如何长期监控RS485总线通讯?

逻辑分析仪如何长期监控RS485总线通讯?RS485是一种非常常用的差分通信总线,传输距离较远,抗干扰性也很好。
但是对于通讯过程中的偶然故障,如何才能实现长达几小时,甚至是几天的通信过程监控呢?测试需求:低成本长期监控RS485总线通信过程。
测试难点:RS485本身是差分总线,需要使用差分探头才能准确捕获信号,但业内很少有逻辑分析仪的差分探头,而且价值非常昂贵。
测试步骤:1、先用示波器配合普通探头看一下波形,如图1。
图 1示波器配合普通探头捕获的波形我们可以清楚的看到在通讯协议信号上叠加了非常大的共模干扰。
这个共模干扰会完全扰乱协议阈值电平的判断,无论是示波器还是逻辑分析仪,都无法设置出一个合理的阈值电平来进行解码。
2、用示波器配合差分探头看一下波形,如图2。
图 2示波器配合差分探头捕获的波形使用差分探头之后,共模干扰被消除,波形也变得比较完美。
配合ZDS2024Plus的协议解码功能可以直接解码出对应的协议数据,从下面参数测量的结果中看各项参数也都没有异常。
但是示波器只能抓一小段时间的信号,即使ZDS2024Plus有250M的存储深度,观测的最长波形时间也只有1400s,无法实现对协议信号长达几小时,甚至是几天的监控。
但是市面上又几乎找不到逻辑分析仪专用的差分探头。
3、使用485隔离模块,配合示波器单端探头观测输出波形。
我们选用RSM(3)485ECHT增强型隔离RS-485收发器,支持最大500K波特率,能够实现485通讯的隔离。
如图3。
图 3RS485隔离模块针对隔离之后的波形,使用示波器配合普通探头观测的波形,如图4:图 4隔离之后,示波器配合普通探头捕获的波形从图片上可以看出,使用示波器+普通探头测量隔离之后的485信号依然可以得到比较完美的波形,与差分探头效果相当。
4、使用485隔离模块后,使用逻辑分析仪长期监测485通讯波形,如图 5。
图 5逻辑分析仪配合隔离模块记录14万帧信号总结:并不一定需要买什么差分探头,如果只是监控RS485总线上的信号,只要用一块RS485隔离模块就好了。
终于讲透了,史上最详细的RS485串口通讯!PLC工程师必看

终于讲透了,史上最详细的RS485串⼝通讯!PLC⼯程师必看RS485接⼝组成的半双⼯⽹络,⼀般是两线制,多采⽤屏蔽双绞线传输,这种接线⽅式为总线式拓扑结构在同⼀总线上最多可以挂接32个结点。
我们知道,最初数据是模拟信号输出简单过程量,后来仪表接⼝是RS232接⼝,这种接⼝可以实现点对点的通信⽅式,但这种⽅式不能实现联⽹功能,随后出现的RS485解决了这个问题。
为此本⽂通过问答的形式详细介绍RS485接⼝。
⼀、什么是RS-485接⼝?它⽐RS-232-C接⼝相⽐有何特点?答:由于RS-232-C接⼝标准出现较早,难免有不⾜之处,主要有以下四点:(1)接⼝的信号电平值较⾼,易损坏接⼝电路的芯⽚,⼜因为与TTL电平不兼容故需使⽤电平转换电路⽅能与TTL电路连接。
(2)传输速率较低,在异步传输时,波特率为20Kbps。
(3)接⼝使⽤⼀根信号线和⼀根信号返回线⽽构成共地的传输形式,这种共地传输容易产⽣共模⼲扰,所以抗噪声⼲扰性弱。
(4)传输距离有限,最⼤传输距离标准值为50英尺,实际上也只能⽤在50⽶左右。
针对RS-232-C的不⾜,于是就不断出现了⼀些新的接⼝标准,RS-485就是其中之⼀,它具有以下特点:1)RS-485的电⽓特性:逻辑“1”以两线间的电压差为+(2-6)V表⽰;逻辑“0”以两线间的电压差为-(2-6)V表⽰。
接⼝信号电平⽐RS-232-C降低了,就不易损坏接⼝电路的芯⽚,且该电平与TTL电平兼容,可⽅便与TTL电路连接。
2)RS-485的数据最⾼传输速率为10Mbps3)RS-485接⼝是采⽤平衡驱动器和差分接收器的组合,抗共模⼲能⼒增强,即抗噪声⼲扰性好。
4)RS-485接⼝的最⼤传输距离标准值为4000英尺,实际上可达3000⽶,另外RS-232-C接⼝在总线上只允许连接1个收发器,即单站能⼒。
⽽RS-485接⼝在总线上是允许连接多达128个收发器。
即具有多站能⼒,这样⽤户可以利⽤单⼀的RS-485接⼝⽅便地建⽴起设备⽹络。
485双机通信案例原理与测试说明

“485双机通信”功能实现说明1程序设计目标及程序运行效果说明程序设计目标:通过本例程理解RS485通信方式,实现双机通信。
程序运行效果:将两块带有485模块的51单片机通过485外接引脚A、B连接起来,单片机上电烧写程序后485模块的D/R引脚所对应的二极管均点亮,然后通过按键KEY3、KEY2控制数码管上的数值进行加减处理,两块单片机起始都默认为接收状态,最后按下KEY1发送键,将数据传送给另一块单片机,而此时接收方数码管上的数值发生相应的改变,与发送方数码管上的数值一致。
2程序相关电路及工作原理说明2.1 RS485通信原理RS232接口是1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。
针对RS232的不足,于是不断出现了新的接口标准,RS485就是其中的一种。
RS485接口的最大传输距离标准值为4000英尺,实际上可达 3000米,另外RS232接口在总线上只允许连接1个收发器,即单站能力。
而RS485接口在总线上是允许连接多达128个收发器。
即具有多站能力,这样用户可以利用单一的RS485接口方便地建立起设备网络。
RS485属于半双工通信,数据可以在一个信号载体的两个方向上传输,但是不能同时进行传输。
电平转换采用差分电路方式,A、B两线的电压差大于0.2认为是逻辑“1”,小于-0.2认为是逻辑“0”,方便与TTL电路连接。
使用RS485进行通信与RS232通信的逻辑是一致的,但RS485抗干扰性更强,传输距离更远。
RS485广泛运用在工业自动化控制、视频监控、门禁对讲以及楼宇报警等各个领域。
图1 485模块电路原理图MAX485芯片的功能是将TTL电平转换为RS485电平,引脚功能如下:(1)485 D/R输出、接收信号控制引脚:当该引脚为低电平时,485为接收态,MAX485通过485_RXD把来自总线的信号输出给单片机;当该引脚为高电平时,485为发送态,来自485_TXD的输出信号通过A、B引脚加载到总线上。
WindowsXPRS485通讯测试程序

WindowsXP/2000下RS485通讯测试程序此测试程序为WindowsXP/2000下的测试工具。
操作说明:1. 把COM1,COM2的设置成RS485, 。
2. 用短接线把的COM1,COM2连接好,即COM1的5/7与COM2的5/7直接连接。
3. 进入系统, 运行RS485Test.exe。
4. 选择要测试的COM口, 工作模式,CHANGE COM MODE:SEND OR READ(S OR R)在这里选择是要发送还是接收。
回车5. 如果COM1,COM2出现相应的字符既表示这2个串口工作正常。
#include <stdio.h>#include <stdlib.h>#include <string.h>#include "Serial.h"//RS485 测试程序int RS485Test(){unsigned int unComNum1 = 0; //unsigned int unComNum2 = 0;unsigned char ucCom1Mod = 0;unsigned char ucCom2Mod = 0;char chCom[5] = {0};CSerial serial1;CSerial serial2;char buffer[1024] = {0};long lSendCounter = 0;char szSendBuff[1024] = {0};DWORD dwRead = 0;int i = 0;//==================输入COM1的端口号和工作模式===========================// fprintf(stdout, "\nEnter COM1 Number (1,2) : ");// scanf("%d", &unComNum1);unComNum1 = 1;fprintf(stdout, "Change COM1 mode: Send or Read(s or r) : ");scanf("%s", &ucCom1Mod);memset(chCom, 0, 5);sprintf(chCom, "COM%d", unComNum1);BOOL bSer = serial1.InitCOM(chCom, 19200, 8, 0, 0, 1);if (!bSer){fprintf(stdout, "Can't InitCOM Com1.\n");return -1;}//==================输入COM2的端口号和工作模式===========================// fprintf(stdout, "\nEnter COM2 Number (1, 2) : ");// scanf("%d", &unComNum2);unComNum2 = 2;fprintf(stdout, "Change COM2 mode: Send or Read(s or r) : ");scanf("%s", &ucCom2Mod);memset(chCom, 0, 5);sprintf(chCom, "COM%d", unComNum2);bSer = serial2.InitCOM(chCom, 19200, 8, 0, 0, 1);if (!bSer){fprintf(stdout, "Can't InitCOM Com2.\n");return -1;}fprintf(stdout, "Input Send data : ");scanf("%s", szSendBuff);for(int k = 0; k < 10; k++){if( (ucCom1Mod=='s') || (ucCom1Mod=='S') ){serial1.SendData(szSendBuff, strlen(szSendBuff));}if( (ucCom2Mod=='s') || (ucCom2Mod=='S') ){serial2.SendData(szSendBuff, strlen(szSendBuff));}Sleep(100);if( (ucCom1Mod=='r') || (ucCom1Mod=='R') ){memset(buffer, 0, sizeof(buffer));dwRead = serial1.ReadData(buffer, sizeof(buffer));printf("COM1 k=%d, Receive DataLen=%d, Data(HEX): ", k, dwRead);for(i = 0; i < dwRead; i++){printf("%x,", buffer[i]);}printf("\n");}if( (ucCom2Mod=='r') || (ucCom2Mod=='R') ){memset(buffer, 0, sizeof(buffer));dwRead = serial2.ReadData(buffer, sizeof(buffer));printf("COM2 k=%d, Receive DataLen=%d, Data(HEX): ", k, dwRead);for(i = 0; i < dwRead; i++){printf("%x,", buffer[i]);}printf("\n");}}serial1.Close();serial2.Close();return 0;}int main(int argc, char **argv){RS485Test();return 0;}// Serial.cpp: implementation of the CSerial class.//////////////////////////////////////////////////////////////////////////#include <winioctl.h>#include <stdio.h>#include <conio.h>#include <stdlib.h>#include "Serial.h"//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CSerial::CSerial(){memset(&m_OverlappedRead, 0, sizeof( OVERLAPPED));memset(&m_OverlappedWrite, 0, sizeof( OVERLAPPED));m_hIDComDev= NULL;fWaitingOnRead = FALSE;}CSerial::~CSerial(){Close();}/********************************************************************** **RS-485通讯说明由于RS-485是半双工通信,故同一时刻只能发送或接收。
逻辑分析仪如何长期监控RS485总线通讯?

逻辑分析仪如何长期监控RS485总线通讯?仪器仪表商情网:RS485是一种十分常用的差分通信,传输距离较远,抗干扰性也很好。
但是对于通讯过程中的偶然故障,如何才干实现长达几小时,甚至是几天的通信过程监控呢?测试需求:低成本长久监控RS485总线通信过程。
测试难点:RS485本身是差分总线,需要用法差分探头才干精确捕捉信号,但业内很少有规律分析仪的差分探头,而且价值十分昂贵。
测试步骤:1、先用协作一般探头看一下波形,1。
图 1示波器协作一般探头捕捉的波形我们可以清晰的看到在通讯协议信号上叠加了十分大的共模干扰。
这个共模干扰会彻低扰乱协议阈值电平的推断,无论是示波器还是规律分析仪,都无法设置出一个合理的阈值电平来举行解码。
2、用示波器协作差分探头看一下波形,2。
图 2示波器协作差分探头捕捉的波形用法差分探头之后,共模干扰被消退,波形也变得比较完善。
协作ZDS2024Plus的协议解码功能可以挺直解码出对应的协议数据,从下面参数测量的结果中看各项参数也都没有异样。
但是示波器只能抓一小段时光的信号,即使ZDS2024Plus 有250M的存储深度,观测的最长波形时光也惟独1400s,无法实现对协议信号长达几小时,甚至是几天的监控。
但是市面上又几乎找不到规律分析仪专用的差分探头。
3、用法485隔离模块,协作示波器单端探头观测输出波形。
我们选用RSM(3)485ECHT增加型隔离RS-485,支持最大500K波特率,能够实现485通讯的隔离。
3。
图 3RS485隔离模块针对隔离之后的波形,用法示波器协作一般探头观测的波形,4:图 4隔离之后,示波器协作一般探头捕捉的波形从上可以看出,用法示波器+一般探头测量隔离之后的485信号依旧可以得到比较完善的波形,与差分探头效果相当。
4、用法485隔离模块后,用法规律分析仪长久监测485通讯波形, 5。
图 5规律分析仪协作隔离模块记录14万帧信号并不一定需要买什么第1页共2页。
[通信电子]RS485通讯协议带实例报文
![[通信电子]RS485通讯协议带实例报文](https://img.taocdn.com/s3/m/b0ca352442323968011ca300a6c30c225901f003.png)
附录一RS485通讯协议一.通讯口1.波特率:300,600,1200,2400,4800,9600,19200 2.起始位:1位3.数据位:7或8位4.校验:Odd/Even/None5.停止位:1位6.传送字符:ASCII出厂时设定为:9600,8,1,N二.上位机通讯格式:+ +1.开始符:ENQ (05H)2.机号:机组号 (1号机30H, 31H)3.PLC型号: FF (46H ,46H)4.命令名:a.读位元件:BR (42H,52H)b.读字元件:WR (57H,52H)c.写位元件:BW (42H,57H)d.写字元件:WW (57H,57H)5.等待时间:60ms (36H)6.数据:a.读字(位)元件命令的数据格式为:元件头(5字节) + 数据长度(2字节)b.写字(位)元件命令的数据格式为:元件头(5字节) + 数据长度(2字节) + 所写数据注:位元件数据用“0”(30H)表示ON,“1”(31H)表示OFFc.字(位)元件定义:控制:开机操作 X11停机操作 X12BWT-300\600\1000\1800\3000\5000-PLC 系列步进式可编程微机组合式调速器说明书 电话:************重庆天人自控设备有限公司 TRZK 1增功操作 X13减功操作 X14自动操作 X15手动操作 X16显示状态:故障 Y14全开 Y15全关 Y16导叶开度 D197机组频率 D198功率给定 D1997.校验和: 机号,PLC 型号,命令名,等待时间和数据的ASCII 码值相加后,取末两位ASCII 码值。
三. PLC 数据传出格式+1. 开始符: ENQ (05H)2. 机号: 机组号 (1号机30H, 31H)3. PLC 型号: FF (46H ,46H)4. 数据; 数据与上位机要求发送的数据长度相同。
5. 结束符: ETX (03H)6.校验和: 机号,PLC 型号,数据和结束符的ASCII 码值 相加后,取末两位ASCII 码值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
RS485通讯实验与CAN 类似,RS-485 是一种工业控制环境中常用的通讯协议,它具有抗干扰能力强、传输距离远的特点。
RS-485 通讯协议由RS-232 协议改进而来,协议层不变,只是改进了物理层,因而保留了串口通讯协议应用简单的特点。
RS-485 协议主要是把RS-232 的信号改进成差分信号,从而大大提高了抗干扰特性。
对比CAN 通讯网络,可发现它们的网络结构组成是类似的,每个节点都是由一个通讯控制器和一个收发器组成,在RS-485 通讯网络中,节点中的串口控制器使用RX 与TX 信号线连接到收发器上,而收发器通过差分线连接到网络总线,串口控制器与收发器之间一般使用TTL 信号传输,收发器与总线则使用差分信号来传输。
发送数据时,串口控制器的TX 信号经过收发器转换成差分信号传输到总线上,而接收数据时,收发器把总线上的差分信号转化成TTL 信号通过RX引脚传输到串口控制器中。
RS-485 通讯网络的最大传输距离可达1200 米,总线上可挂载128 个通讯节点,而由于RS-485 网络只有一对差分信号线,它使用差分信号来表达逻辑,当AB 两线间的电压差为-6V~-2V 时表示逻辑1,当电压差为+2V~+6V 表示逻辑0,在同一时刻只能表达一个信号,所以它的通讯是半双工形式的。
RS-485 与RS-232 的差异只体现在物理层上,它们的协议层是相同的,也是使用串口数据包的形式传输数据。
由于RS-485 与RS-232 的协议层没有区别,进行通讯时,我们同样是使用STM32 的USART 外设作为通讯节点中的串口控制器,再外接一个RS-485 收发器芯片把USART 外设的TTL 电平信号转化成RS-485 的差分信号即可。
RS-485—双机通讯实验本小节演示如何使用STM32 的USART 控制器与MAX485 收发器,在两个设备之间使用RS-485协议进行通讯,本实验中使用了两个实验板,无法像CAN 实验那样使用回环测试(把STM32USART 外设的TXD 引脚使用杜邦线连接到RXD 引脚可进行自收发测试,不过这样的通讯不经过RS-485 收发器,跟普通TTL 串口实验没有区别),本教程主要以“USART—485 通讯”工程进行讲解。
由于485 只能以半双工的形式工作,所以需要切换状态,MAX485 芯片中有“RE”和“DE”两个引脚,用于控制485 芯片的收发工作状态的,当RE 引脚为低电平时,485 芯片处于接收状态,当DE 引脚为高电平时芯片处于发送状态。
实验板中使用了STM32 的PC0 直接连接到这两个引脚上,所以通过控制PC0 的输出电平即可控制485 的收发状态,在本开发板中,PC0 引脚与摄像头使用的引脚共用了,所以使用485 时不要同时驱动摄像头。
还要注意的是,为防止干扰,平时我们默认是不给485 收发器供电的,使用485 的时候一定要把485 接线端子旁边的“C/4-5V”排针使用跳线帽与“5V”排针连接起来进行供电;而又由于实验板的RS-232 与RS-485 通讯实验都使用STM32 的同一个USART 外设及收发引脚,实验时注意必须要把STM32 的“PA2 引脚”与MAX485 的“485_D”及“PA3”与“485_R”使用跳线帽连接起来(这些信号都在485 接线端子旁边的排针上)。
要实现通讯,我们还要使用导线把实验板引出的 A 和 B 两条总线连接起来,才能构成完整的网络。
实验板之间A 与 A 连接,B 与B 连接即可。
编程要点(1)初始化485 通讯使用的USART 外设及相关引脚;(2)编写控制MAX485 芯片进行收发数据的函数;(3)编写测试程序,收发数据。
void _485_Config(void){GPIO_InitTypeDef GPIO_InitStruct;RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit;__GPIOD_CLK_ENABLE();/* 配置485串口时钟源*/RCC_PeriphClkInit.PeriphClockSelection =RCC_PERIPHCLK_USART2;RCC_art2ClockSelection = RCC_USART2CLKSOURCE_SYSCLK;HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);/* 使能UART 时钟*/__USART2_CLK_ENABLE();/**USART2 GPIO ConfigurationPD5 ------> USART2_TXPD6 ------> USART2_RX*//* 配置Tx引脚为复用功能*/GPIO_InitStruct.Pin =GPIO_PIN_5;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;GPIO_InitStruct.Alternate = GPIO_AF7_USART2;HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);/* 配置Rx引脚为复用功能*/GPIO_InitStruct.Pin = GPIO_PIN_6;GPIO_InitStruct.Alternate = _485_USART_RX_AF;HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);/* 485收发控制管脚*/GPIO_InitStruct.Pin = GPIO_PIN_11;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);/* 配置串485_USART 模式*/Uart2_Handle.Instance = USART2;Uart2_Handle.Init.BaudRate = 115200;Uart2_Handle.Init.WordLength = UART_WORDLENGTH_8B;Uart2_Handle.Init.StopBits = UART_STOPBITS_1;Uart2_Handle.Init.Parity = UART_PARITY_NONE;Uart2_Handle.Init.Mode = UART_MODE_TX_RX;Uart2_Handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;Uart2_Handle.Init.OverSampling = UART_OVERSAMPLING_16;Uart2_Handle.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED;Uart2_Handle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;HAL_UART_Init(&Uart2_Handle);/*串口2中断初始化*/NVIC_Configuration();/*配置串口接收中断*/__HAL_UART_ENABLE_IT(&Uart2_Handle,UART_IT_RXNE);//默认进入接收模式HAL_GPIO_WritePin(GPIOD,GPIO_PIN_11,GPIO_PIN_RESET);}与所有使用到GPIO 的外设一样,都要先把使用到的GPIO 引脚模式初始化,配置好复用功能,其中用于控制MAX485 芯片的收发状态的引脚被初始化成普通推挽输出模式,以便手动控制它的电平输出,切换状态。
485 使用到的USART 也需要配置好波特率、有效字长、停止位及校验位等基本参数,在通讯中,两个485 节点的串口参数应一致,否则会导致通讯解包错误。
在实验中还使能了串口的接收中断功能,当检测到新的数据时,进入中断服务函数中获取数据。
/// 配置USART接收中断static void NVIC_Configuration(void){/* 配置抢占优先级的分组*/HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);/*中断设置,抢占优先级0,子优先级为0*/HAL_NVIC_SetPriority(USART2_IRQn, 1 ,1);HAL_NVIC_EnableIRQ(USART2_IRQn);}//中断缓存串口数据#define UART_BUFF_SIZE 1024volatile uint16_t uart_p = 1;uint8_t uart_buff[UART_BUFF_SIZE];void USART2_IRQHandler(void){if(uart_p<UART_BUFF_SIZE){if(__HAL_UART_GET_IT( &Uart2_Handle, UART_IT_RXNE ) != RESET){HAL_UART_Receive(&Uart2_Handle, (uint8_t *)(&uart_buff[uart_p]),1 , 1000);uart_p++;}}else{clean_rebuff();}HAL_UART_IRQHandler(&Uart2_Handle);}//获取接收到的数据和长度char *get_rebuff(uint16_t *len){*len = uart_p;return (char *)&uart_buff;}//清空缓冲区void clean_rebuff(void){uint16_t i=UART_BUFF_SIZE+1;uart_p = 0;while(i)uart_buff[--i]=0;}这个数据接收过程主要思路是使用了接收缓冲区,当USART 有新的数据引起中断时,调用库函数USART_ReceiveData 把新数据读取到缓冲区数组uart_buff 中,其中get_rebuff 函数可以用于获缓冲区中有效数据的长度,而clean_rebuff 函数可以用于对缓冲区整体清0,这些函数配合使用,实现了简单的串口接收缓冲机制。