Skip to content

Commit 812a59a

Browse files
econealelucasssvazSuGlider
authored
Added example to demonstrate using HardwareSerial with RS485 interfaces (#8941)
* Added Serial as RS485 interface demo * Added more detail to initial comment * Switched to UART_MODE definitions from uart_types.h in order to accomodate some versions of Arduino core * Update libraries/ESP32/examples/Serial/RS485_Echo_Demo/RS485_Echo_Demo.ino Co-authored-by: Lucas Saavedra Vaz <[email protected]> * Update libraries/ESP32/examples/Serial/RS485_Echo_Demo/RS485_Echo_Demo.ino Co-authored-by: Lucas Saavedra Vaz <[email protected]> * Update libraries/ESP32/examples/Serial/RS485_Echo_Demo/RS485_Echo_Demo.ino Co-authored-by: Lucas Saavedra Vaz <[email protected]> * Removed HardwareSerial.h include. Switched RTS pin to GPIO 4 for broader compatability. * using 115200 for UART0 - console --------- Co-authored-by: Lucas Saavedra Vaz <[email protected]> Co-authored-by: Rodrigo Garcia <[email protected]>
1 parent 5d97e02 commit 812a59a

File tree

1 file changed

+48
-0
lines changed

1 file changed

+48
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
This Sketch demonstrates how to use the Hardware Serial peripheral to communicate over an RS485 bus.
3+
4+
Data received on the primary serial port is relayed to the bus acting as an RS485 interface and vice versa.
5+
6+
UART to RS485 translation hardware (e.g., MAX485, MAX33046E, ADM483) is assumed to be configured in half-duplex
7+
mode with collision detection as described in
8+
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/uart.html#circuit-a-collision-detection-circuit
9+
10+
To use the script open the Arduino serial monitor (or alternative serial monitor on the Arduino port). Then,
11+
using an RS485 tranciver, connect another serial monitor to the RS485 port. Entering data on one terminal
12+
should be displayed on the other terminal.
13+
*/
14+
#include "hal/uart_types.h"
15+
16+
#define RS485_RX_PIN 16
17+
#define RS485_TX_PIN 5
18+
#define RS485_RTS_PIN 4
19+
20+
#define RS485 Serial1
21+
22+
void setup() {
23+
Serial.begin(115200);
24+
while(!Serial) { delay(10); }
25+
26+
RS485.begin(9600, SERIAL_8N1, RS485_RX_PIN, RS485_TX_PIN);
27+
while(!RS485) { delay(10); }
28+
if(!RS485.setPins(-1, -1, -1, RS485_RTS_PIN)){
29+
Serial.print("Failed to set RS485 pins");
30+
}
31+
32+
// Certain versions of Arduino core don't define MODE_RS485_HALF_DUPLEX and so fail to compile.
33+
// By using UART_MODE_RS485_HALF_DUPLEX defined in hal/uart_types.h we work around this problem.
34+
// If using a newer IDF and Arduino core you can ommit including hal/uart_types.h and use MODE_RS485_HALF_DUPLEX
35+
// defined in esp32-hal-uart.h (included during other build steps) instead.
36+
if(!RS485.setMode(UART_MODE_RS485_HALF_DUPLEX)) {
37+
Serial.print("Failed to set RS485 mode");
38+
}
39+
}
40+
41+
void loop() {
42+
if (RS485.available()) {
43+
Serial.write(RS485.read());
44+
}
45+
if (Serial.available()) {
46+
RS485.write(Serial.read());
47+
}
48+
}

0 commit comments

Comments
 (0)