ESP32平台关于RS485分时双向通信的总结

发布时间 2023-12-21 18:32:24作者: peter1990

ESP32平台关于RS485分时双向通信的一些总结

介绍

  1. ESP32在Arduino环境下收发数据有两个关键函数,一个是Serial.available(),用于检测当前串口的缓存中有无数据,另外一个是Serial.onReceive(onSerialReceive, true);,通过类似于中断的方式,接收数据帧,参数onSerialReceive为接收数据函数,函数中还需要检测当前串口缓存中是否有数据。
  2. 之前的项目中,在ESP32平台上使用RS485总线,数据流方向控制使用指定IO进行控制,需要在程序中添加短暂延时函数,保证收发数据完整,但在最近的项目中发现,ESP32在Arduino的库函数中,具备RS485的流控功能。

实现方法:

  1. 以下代码为通过onReceive函数,实现读取串口数据代码:
    在setup函数中添加以下代码:
  Serial.begin(115200);
  Serial.onReceive(onSerialReceive, true);
对函数onSerialReceive的声明:
void onSerialReceive()
{
  if (Serial.available())
  {
    Serial.read(serialbuf, Serial.available()); //read data from serial buffer to data array - serialbuf
  }
}
  1. 以下代码将ESP32的Serial1作为RS485总线的收发串口,则通过Serial1.begin(115200)初始化串口1,通过setPins函数,将串口的rtsPin设置为RS485流控接口,对应的库函数为bool HardwareSerial::setPins(int8_t rxPin, int8_t txPin, int8_t ctsPin, int8_t rtsPin)
    经过以上配置,Serial1接口即可设置为接收RS485总线数据,并通过指定的IO口对数据流方向进行控制。之后,通过配置串口工作模式Serial1.setMode(0X01);,将串口的工作模式配置为UART_MODE_RS485_HALF_DUPLEX,设置串口onReceive函数,并打开此功能,即可实现RS485的双向自动收发。
Serial1.begin(115200);
Serial1.setPins(RS485_RX, RS485_TX, -1, RS485_RTS);
Serial1.setMode(0X01); //UART_MODE_RS485_HALF_DUPLEX
Serial1.setTimeout(5);
Serial1.onReceive(on485Receive, true);
    

总结

以上两种方法的配合使用,提高了ESP32接收RS485总线数据的效率。
在使用中,如接收RS485总线数据帧,可参考博文:ESP32在Arduino环境下的串口数据帧接收