ESP32平台关于RS485分时双向通信的一些总结
介绍
- ESP32在Arduino环境下收发数据有两个关键函数,一个是
Serial.available()
,用于检测当前串口的缓存中有无数据,另外一个是Serial.onReceive(onSerialReceive, true);
,通过类似于中断的方式,接收数据帧,参数onSerialReceive
为接收数据函数,函数中还需要检测当前串口缓存中是否有数据。 - 之前的项目中,在ESP32平台上使用RS485总线,数据流方向控制使用指定IO进行控制,需要在程序中添加短暂延时函数,用以保证收发数据完整,但在最近的项目中发现,ESP32在Arduino的库函数中,具备RS485的流控功能。
实现方法:
- 以下代码为通过
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
}
}
- 以下代码将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环境下的串口数据帧接收