|
| 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