RS485通信介绍

  典型的串口通信标准有 RS232 和 RS485,RS232 是全双工点对点的通信,而RS485 是半双工通信(2 线制),可以一点对多点进行组网,而且RS485是用缆线两端的电压差值来表示传递信号,这与 RS232 电气特性大不一样。RS485仅仅规定了接收端和发送端的电气特性,并没有规定或推荐任何数据协议,因此RS485 的协议层可以和 RS232 一样。

  RS485的特点:

  1. 接口电平低,不易损坏芯片。RS485 的电气特性:逻辑“1”以两线间的电压差为+(2~6)V 表示;逻辑“0”以两线间的电压差为-(2~6)V 表示。接口信号电平比 RS232 降低了,不易损坏接口电路的芯片,且该电平与 TTL 电平兼容,可方便与 TTL 电路连接。
  2. 传输速率高。10 米时,RS485 的数据最高传输速率可达 35Mbps,在1200m 时,传输速度可达 100Kbps。
  3. 抗干扰能力强。RS485 接口是采用平衡驱动器和差分接收器的组合,抗共模干扰能力增强,即抗噪声干扰性好。
  4. 传输距离远,支持节点多。RS485 总线最长可以传输 1200m 以上(速率≤100Kbps)一般最大支持 32 个节点,如果使用特制的 485 芯片,可以达到128 个或者 256 个节点,最大的可以支持到 400 个节点。

  RS485 推荐使用在点对点,线型,总线型网络中,不能使用在星型和环型网络。理想情况下 RS485 需要 2 个终端匹配电阻,其阻值要求等于传输电缆的特性阻抗(一般为 120Ω)。没有特性阻抗的话,当所有的设备都静止或者没有能量的时候就会产生噪声,而且线移需要双端的电压差。没有接电阻的话,会使得较快速的发送端产生多个数据信号的边缘,导致数据传输出错。RS485推荐的连接方式如下图所示

  在RS485通信网络中,通常会使用485收发器来转换TTL电平和RS485电平。节点中的串口控制器使用RX与TX信号线连接到485收发器上,而收发器通过差分线连接到网络总线,串口控制器与收发器之间一般使用 TTL 信号传输,收发器与总线则使用差分信号来传输。发送数据时,串口控制器的 TX 信号经过收发器转换成差分信号传输到总线上,而接收数据时,收发器把总线上的差分信号转化成 TTL 信号通过 RX 引脚传输到串口控制器中。通常在这些节点中只能有一个主机,剩下的全为从机。在总线的起止端分别加了一个 120 欧的匹配电阻。

  当前开发板采用MAX485作为收发器,该芯片支持5V 供电,最大传输速度可达10Mbps, 支持多达 32 个节点,并且有输出短路保护。该芯片的框图如下图所示:

  • A、B为RS485总线接口,用于连接 485 总线
  • RO 是接收输出端
  • DI是发送数据输入端
  • RE 是接收使能信号(低电平有效)
  • DE是发送使能信号(高电平有效)

  因为 RS485 为半双工通信,通过 RE 和 DE 就能控制发送与接收。

  本实验使用51单片机的串口跟 PC 机进行 RS485 通信,这里要特别注意,因为 PC 机不具有 RS485 接口,所以我们需要使用一个 RS232/RS485 的转换器,DB9 接口连接 PC 机,RS485 总线接口连接我们开发板上RS485模块的A 和 B。RS232/RS485 转换器如下图所示:

硬件设计

  本实验使用到硬件资源如下:

  1. 串口
  2. RS485收发器:MAX485

  串口是51单片机内部资源,只要对其配置即可使用,RS485模块电路如下图所示:

  使用2根导线将开发板上 485 模块的 A 和 B 与RS232/RS485 转换器的 A 和 B 对应连接,这里一定要注意不能交叉,否则通信异常。

  因为STC89C5x单片机内部只有一个串口,所以RS232和RS485不能同时使用,只能单独使用。还有就是USB转串口模块上也是要接到单片机串口上,所以在使用单片机串口(除使用USB转串口模块)时,比如WIFI、蓝牙、GPS、GSM/GPRS等应用,如果遇到通信不正常或者有干扰的情况,可以把CH340上的串口短接片拔掉

软件设计

  本实验所要实现的功能是:当串口助手发送数据给单片机,单片机原封不动转发给串口助手显示。

实物接线图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/**************************************************************************************
实验名称:RS485通信实验
接线说明:
实验现象:下载程序后,当串口助手发送数据给单片机,单片机原封不动转发给串口助手显示
注意事项:
***************************************************************************************/
#include "reg52.h"

typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;


//定义控制引脚IO
sbit RS485_DIR=P1^0;//发送和接收控制


/*******************************************************************************
* 函 数 名 : delay_10us
* 函数功能 : 延时函数,ten_us=1时,大约延时10us
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_10us(u16 ten_us)
{
while(ten_us--);
}

/*******************************************************************************
* 函 数 名 : uart_init
* 函数功能 : 串口通信中断配置函数,通过设置TH和TL即可确定定时时间
* 输 入 : baud:波特率对应的TH、TL装载值
* 输 出 : 无
*******************************************************************************/
void uart_init(u8 baud)
{
TMOD|=0X20; //设置计数器工作方式2
SCON=0X50; //设置为工作方式1
PCON=0X80; //波特率加倍
TH1=baud; //计数器初始值设置
TL1=baud;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
}

/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
uart_init(0XFA);//波特率为9600
RS485_DIR=0;//配置RS485为接收模式
while(1)
{

}
}

void uart() interrupt 4 //串口通信中断函数
{
u8 rec_data;

RI = 0; //清除接收中断标志位
rec_data=SBUF; //存储接收到的数据
delay_10us(100);
RS485_DIR=1;//配置RS485为发送模式
SBUF=rec_data; //将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
RS485_DIR=0;//配置RS485为接收模式
}