| 前面我们提到过串行接口按标准被分为RS-232、RS-422、RS-485。我们的A板扩展板就集成了RS485(MAX485)接口。 RS485采用差分信号负逻辑,+2V~+6V表示“0”,- 6V~- 2V表示“1”。RS485有两线制和四线制两种接线,四线制只能实现点对点的通信方式,现很少采用,现在多采用的是两线制接线方式,这种接线方式为总线式拓朴结构在同一总线上最多可以挂接32个结点。在RS485通信网络中一般采用的是主从通信方式,即一个主机带多个从机。很多情况下,连接RS-485通信链路时只是简单地用一对双绞线将各个接口的“A”、“B”端连接起来。其理论的通讯距离是1200米,速率高达20Mbps,并可以用在强噪声的环境中正常工作,在工业通讯领域中被广泛应用。 RS485通讯的点对点接法和主从机接法如下图:

以上2种接法建议都接上地线,以保证减小干扰。在主从网络中,通讯线必须手牵手地并联下去,不可以有星型连接或者分叉。 RS485协议只是把TTL的串口转换成差分方式的通讯接口,485芯片的端口还是接到Arduino的RX(PIN0)和TX(PIN1)端,两线制的RS485是属于半双工网络,则需要有个端口来控制AB差分线上何时收何时发,这就会用到Arduino上的PIN2。
老版本扩展板上需要插上485接口选择插针,如左图红圈处的3个插针都要插上,新版本的扩展板的3个插针都需要插到上面如右图红圈处:

老版本扩展板 新版本扩展板
完成上面的操作,我们就可以玩代码了,2个简单的代码:
主机代码: int EN = 2;
void setup() { pinMode(EN, OUTPUT); Serial.begin(19200); }
void loop() { // send data digitalWrite(EN, HIGH);//使能发送 Serial.print('A'); delay(1000); }
从机代码: int ledPin = 13; int EN = 2; int val;
void setup() { pinMode(ledPin, OUTPUT); pinMode(EN, OUTPUT); Serial.begin(19200); }
void loop() { // receive data digitalWrite(EN, LOW);//使能接收 val = Serial.read(); if (-1 != val) { if ('A' == val) { digitalWrite(ledPin, HIGH); delay(500); digitalWrite(ledPin, LOW); delay(500); } } }
代码编译后,分别下载到2个Arduino中(下载代码时请拔掉上图所示的485接口选择插针,因为它要占用串口,导致下载失败),然后连接2个扩展板上的485接口,A-A,B-B,GND-GND。主机Arduino模块会向从机不停的发送字母A,然后从机接收到字母A,并使数字PIN13上的发光二极管闪烁。 |