嵌入式接口协议(2)—RS485通讯协议
1. 485简介
485(一般称作RS485/EIA-485)是隶属于OSI模型物理层的电气特性规定为2线,半双工,多点通信的标准。它的电气特性和RS-232大不一样。用缆线两端的电压差值来表示传递信号。RS485仅仅规定了接受端和发送端的电气特性。它没有规定或推荐任何数据协议。
2. RS485特点
(1)RS485通信采用差分信号传输,以A、B的电压差表示数据的“0”和“1”;其中,VA-VB≥+200mV表示逻辑“1”;VA-VB≤-200mV表示逻辑“0”。
(2)传输速率高。10米时,RS485的数据最高传输速率可达35Mbps,在1200m时,传输速率可达100Kbps;
(3)抗干扰能力强。RS485接口是采用平衡驱动器和差分接收器的组合,抗共模干扰能力增强,即抗噪声干扰性好。
(4)传输距离远,支持节点多。RS485总线最长可以传输1200m以上(速率≤100Kbps)一般最大支持32个节点,如果使用特制的485芯片,可以达到128个或者256个节点,最大的可以支持到400个节点。
3. RS485连接方式
RS485推荐使用在点对点、线型、总线型网络中,不能是星型,环型网络。理想情况下RS485需要2个匹配电阻,其阻值要求等于传输电缆的特性阻抗(一般为120Ω)。
若没有特性阻抗的话,当所有的设备处于空闲状态时,由于A、B都没有输出,此时A、B之间的点压差处于一个不确定的值,可能导致错误数据。一般添加匹配电阻时,选择在起止位置加入,也就是主机和设备4上各添加一个120Ω的匹配电阻。
添加配置方法如下:
4. RS485控制(SP3485为例)
一般应用中,将Pin2 和Pin3连接在一起,使用控制器的一个管脚进行收发状态控制。由于RS485为半双工收发器,因此当需要发送数据时,需先设置Pin3(DE)为高电平;当需要接受数据时,需先设置Pin3(DE)为低电平。
5. 例程
设备空闲状态下,默认处于接收模式,如果要发送数据,则需要在发送前设置为发送模式,且在发送完成后,恢复接收模式。
(1)RS485发送数据:
//RS485发送len个字节. //buf:发送区首地址 //len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节) void RS485_Send_Data(u8 *buf,u8 len) { u8 t; RS485_TX_EN=1; //设置为发送模式 for(t=0;t<len;t++) //循环发送数据 { while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET); USART_SendData(USART2,buf[t]); } while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET); RS485_RX_CNT=0; RS485_TX_EN=0; //设置为接收模式 }
(2)RS485接收数据
//RS485查询接收到的数据 //buf:接收缓存首地址 //len:读到的数据长度 void RS485_Receive_Data(u8 *buf,u8 *len) { u8 rxlen=RS485_RX_CNT; u8 i=0; *len=0; //默认为0 delay_ms(10); //等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束 if(rxlen==RS485_RX_CNT&&rxlen)//接收到了数据,且接收完成了 { for(i=0;i<rxlen;i++) { buf[i]=RS485_RX_BUF[i]; } *len=RS485_RX_CNT; //记录本次数据长度 RS485_RX_CNT=0; //清零 } }
5. 调试记录
在实际使用中,有时出现RS485传输数据乱码的状况;此时,强烈建议先检查硬件电路,确认RX、TX接收端的匹配电路是否一致?