老是忘记一些基础知识点,最近使用modbus老是与串口打交道,再此做下笔记。为方便自己理解在作者原文基础上有一些轻微修改。 

RS232接口是一种用于近距离(最大30-60米)、慢速度、点对点通讯的通讯协议,在RS232中一个信号只用到一条信号线,采取与地电压参考的方式,因而在长距离传输后,发送端和接收端地电压有出入,容易造成通讯出错或速度降低。

RS485/422接口采用不同的方式:每个信号都采用双绞线(两根信号线)传送,两条线间的电压差用于表示数字信号。例如把双绞线中的一根标为 A(正),另一根标为B(负),当A为正电压(通常为+5V),B为负电压时(通常为0),表示信号“1”;反之,A为负电压,B为正电压时表示信号 “0”。RS485/422允许通讯距离可达到1200米,采用合适的电路可达到2.5MB/s的传输速率。

RS422与RS485采用相同的通讯协议,但有所不同:它采用两根双绞线,数据可以同时双向传递(全双工)。 而RS485则采用一根双绞线,输入输出信号不能同时进行(半双工),RS485可用于多点通讯,一条信号线上可连接多个设备,它通常采用主/从结构。

在RS485(半双工)通信中,发送信号时,由TXD输出的TTL电平信号经RS485转换器转换后,从发送器(A和B)输出RS485信号;接收信号时,RS485信号经接收器(A和B)接收后,然后RS485转换器将信号转换为TTL电平信号,传给RXD。(注意:2个需要通讯设备之间是各有一个RS485转换器并不是它们的信号只经过了一个RS485转换器就成功通讯了

android rs485串口编程实例 rs485串口原理图_引脚

在RS422(全双工)通信中,因信号的输入和输出分开,所以需要两根双绞线来传送输入和输出信号,标为A、B、Y、Z(A为输入信号的正极,B为输入信 号的负极,Y为输出信号的正极,Z为输出信号的负极)。发送信号时,由TXD输出的TTL电平信号经RS422转换器后,从发送器(Y和Z)输出RS485/RS422 信号;接收信号时,RS485/RS422信号经接收器(A和B)接收后,RS422转换器将信号转换为TTL电平信号,传给串口的RXD。

android rs485串口编程实例 rs485串口原理图_数据_02


图1:DM系列RS485/RS422接口转换器原理图(半双工)

android rs485串口编程实例 rs485串口原理图_android rs485串口编程实例_03


图2:DM系列RS485/RS422接口转换器原理图(全双工)以上图片只是贴出了一半的接线图,这里给出一张多机通讯的RS485接线原理图(半双工)

android rs485串口编程实例 rs485串口原理图_数据_04

二、典型接法

DM485的输出端最多可以连接256个RS485接口,其典型接法如图3(半双工)和图4(全双工)所示。在最远的两个终端上,输入和输出端之间各需接 上一个120欧姆的电阻。在RS485/RS422的接口连接时,甲接口的输出端接乙接口的输入端,双绞线的正极接正极,负极接负极;甲接口的输入端接乙 接口的输出端,双绞线的正极接正极,负极接负极。

android rs485串口编程实例 rs485串口原理图_数据_05

android rs485串口编程实例 rs485串口原理图_android rs485串口编程实例_06

四、注意事项

1、在长距离传输中,一定要使用用双绞线

2、多终端传输时,距离最远的两个终端上,输入和输出端之间一定连接120欧姆的电阻。

补充:我不知道为什么那么多的资料都没有说明RS485通信发送和接收数据时的细节,都只说2根线就能发送和接收数据??? 注意:485芯片有个控制端,控制端高电平时候为接收数据,低电平时候为发送数据。而我们在实际项目开发的时候,在使用RS485通信时,如果自己的电路并没有设计成RS485硬件自收发切换的电路,则需要自己控制485的收发使能引脚。即发送数据时,需要拉低485芯片控制端的IO口;相反接收数据时,需要拉高控制端的IO口。



需要自己控制收发的485芯片原理图:

android rs485串口编程实例 rs485串口原理图_接口_07


控制策略:UART_CON为低电平,485处于接收状态;UART_CON为高电平,485处于发送状态。通过切换UART_CON的电平来达到485收发状态的切换。



485芯片硬件自动收发切换电路:

android rs485串口编程实例 rs485串口原理图_数据_08


接收:默认没有数据时,在接收数据的过程中,TXD引脚是一直保持高电平的,三极管导通,RE低电平使能,485芯片处于接收状态,然后485芯片的RO引脚(也就是接RXD的引脚)就会反应AB传输过来的数据。

发送:发送数据时,TX会先有一个下拉的电平(起始位-由高向低),表示开始发送数据,此时三极管截止,DE为高电平发送使能。当发送数据“0”时,由于DI接口相当于接地,此时数据“0”就会传输到AB扣,A-B<0,则传输“0”,完成低电平传输,当发送“1”时,此时三极管导通,RE变为低电平,按理说会让接收使能,但是由于还处于发送数据中,这种状态下MAX485处于高阻态,此时的状态通过A上拉电阻(R5),B下拉电阻(R4)决定,此时A-B>0传输“1”,完成高电平的传输。

注意:这里面有个疑惑,发送数据“1”,三极管RE低电平有效,应该是接收使能,为什么芯片是高阻态呢?这是因为UART发送数据是有一定格式的,TX和RX数据均以“位”为最小单位进行传输,在发送数据之前,UART之间要约定好数据传输速率,即波特率,数据传输格式(数据位,校验,停止),平时数据线处于空闲状态(1状态),当发送数据时,TX由“1”变为“0”维持1位的时间,这样接收方检测到开始位后,再等待1.5位时间就开始一位一位的进行数据传输了,也就是说,已经确定好发送状态,电路发送“1”时RE虽然有效,但是由于它处于发送阶段,芯片也不会收,即芯片处于高阻状态。