飞书文档https://x509p6c8to.feishu.cn/wiki/LNUjw1bHDiIkICkKRSRc6NccnQj
什么是RS485?
RS485是美国电子工业协会(Electronic Industries Association,EIA)于1983年发布的串行通信接口标准。
RS485的特点:
总线标准,RS485具有支持多节点
一条RS485总线能并联多少台设备要看什么芯片,可以控制多少个设备的问题是与该485网络中的电气特性和协议特性所决定的,并和所用电缆的品质相关,节点越多、传输距离越远、电磁环境越恶劣,所选的电缆要求就越高。 |
传输距离远(最大1219m)
连接简单(在构成通信网络时,仅需要一对双绞线作传输线)
能抑制共模干扰(差分传输)
在多站、远距离通信等多种工控环境中获得了广泛应用。
多个设备进行485通讯的接线
RS-485通信链路时只是简单地用一对双绞线将各个接口的“A”、“B”端连接起来
在低速、短距离、无干扰的场合可以采用普通的双绞线,反之,在高速、长线传输时,则必须采用阻抗匹配(一般为120Ω)的RS485专用电缆(STP-120Ω(用于RS485 & CAN)),而在干扰恶劣的环境下还应采用铠装型双绞屏蔽电缆(ASTP-120Ω(用于RS485 & CAN))。
STM32的RS485通信
STM32是没有硬件485接口的,所以通常使用485收发器将UART的TTL电平转换成RS485的差分信号。MCU的串口控制器TxD发送数据,经485收发器转换成差分信号,传输到总线上。接收数据时,485收发器将总线上的差分信号转化成TTL信号由RxD到串口控制器。
这里的485收发器,我们使用SP3485芯片。
我们先看看普通的收发电路。
DE: 1 发送使能;0发送禁止 |
当单片机要发送数据的时候,控制CTRL为高电平,数据通过485_TXD发送出去。
当单片机要接收数据的时候,控制CTRL为低电平,数据通过485_RXD接收回来。
这里我们可以看到需要485_RXD、485_TXD、CTRL 3个IO进行控制,如果我们希望使用更少的IO控制,有没有办法呢?
那我们可以使用自动收发电路,不用单片机引脚CTRL,当数据进来的时候,数据会自动通过RXD到单片机,当需要发送数据时,自动通过TXD发送出去。也就是只需要连接单片机的RXD和TXD引脚就可以,无需用单片机引脚连接485芯片的DE RE引脚。
R5的作用是限流,保护引脚,R5的大小,可以选择470欧、1K、4.7K都可以。 |
接线
因为我们电脑也是没有485接口的,所以如果需要接收485信号,则需要用485转UART的模块进行转换。
485通信接线是不交叉的,即A接A,B接B,可以多节点的挂载在总线上。
原理图
R3为120欧的阻抗匹配电阻,如果长距离通信的话,一定要在最后一个节点接上这一个电阻;
我们可以看到这里的UART转485使用PD2和PC12两个IO,对应UART5,
新建或复制工程,开启UART5,UART5对应PD2和PC12
代码和串口部分逻辑一样:
/* USER CODE BEGIN 2 */
uint8_t rxbuf[12];
uint8_t ackbuf[]="ack";
/* USER CODE END 2 */
while (1)
{
/* USER CODE BEGIN 3 */
// uint8_t txbuf[]="Hello,world!";
// HAL_UART_Transmit(&huart5,txbuf,sizeof(txbuf),1000);
// HAL_Delay(500);
if(HAL_UART_Receive(&huart5,rxbuf,sizeof(rxbuf),1000) == HAL_OK){
HAL_UART_Transmit(&huart5,ackbuf,sizeof(ackbuf),1000);
}
}
参考工程
参考飞书文档