Advertisement
Guest User

Untitled

a guest
Dec 13th, 2019
1,014
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.76 KB | None | 0 0
  1. #include <Arduino.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4. #include <stddef.h>
  5. #include <driver/uart.h>
  6.  
  7. #define ECHO_UART_PORT UART_NUM_2
  8. #define ECHO_TEST_TXD   (23)
  9. #define ECHO_TEST_RXD   (22)
  10. #define ECHO_TEST_RTS   (18)
  11. #define ECHO_TEST_CTS  UART_PIN_NO_CHANGE
  12. #define BUF_SIZE        (127)
  13. #define BAUD_RATE       (115200)
  14. #define PACKET_READ_TICS        (100 / portTICK_RATE_MS)
  15. static const char *TAG = "RS485_ECHO_APP";
  16.  
  17. void setup() {
  18.     Serial.begin(115200); //uses UART_NUM_0
  19.     //configure UART_NUM_2 for RS485
  20.     const uart_port_t uart_num = ECHO_UART_PORT;
  21.     uart_config_t uart_config = {
  22.         .baud_rate = BAUD_RATE,
  23.         .data_bits = UART_DATA_8_BITS,
  24.         .parity = UART_PARITY_DISABLE,
  25.         .stop_bits = UART_STOP_BITS_1,
  26.         .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
  27.         .rx_flow_ctrl_thresh = 122,
  28.     };
  29.  
  30.     Serial.println("Start RS485 application test and configure UART.");
  31.  
  32.     // Configure UART parameters
  33.     uart_param_config(uart_num, &uart_config);
  34.  
  35.     Serial.println("UART set pins, mode and install driver.");
  36.     // Set UART1 pins(TX: IO23, RX: I022, RTS: IO18, CTS: IO19)
  37.     uart_set_pin(uart_num, ECHO_TEST_TXD, ECHO_TEST_RXD, ECHO_TEST_RTS, ECHO_TEST_CTS);
  38.  
  39.     // Install UART driver (we don't need an event queue here)
  40.     // In this example we don't even use a buffer for sending data.
  41.     uart_driver_install(uart_num, BUF_SIZE * 2, 0, 0, NULL, 0);
  42.  
  43.     // Set RS485 half duplex mode
  44.     uart_set_mode(uart_num, UART_MODE_RS485_HALF_DUPLEX);
  45.  
  46.     ESP_LOGI(TAG, "UART start recieve loop.\r\n");
  47.     uart_write_bytes(uart_num, "Start RS485 UART test.\r\n", 24);
  48. }
  49.  
  50. void loop() {
  51.     const uart_port_t uart_num = ECHO_UART_PORT;
  52.     // Allocate buffers for UART
  53.     uint8_t* data = (uint8_t*) malloc(BUF_SIZE);
  54.  
  55.     //Read data from UART
  56.     int len = uart_read_bytes(uart_num, data, BUF_SIZE, PACKET_READ_TICS);
  57.  
  58.     //Write data back to UART
  59.     if (len > 0) {
  60.         uart_write_bytes(uart_num, "\r\n", 2);
  61.         char prefix[] = "RS485 Received: [";
  62.         uart_write_bytes(uart_num, prefix, (sizeof(prefix) - 1));
  63.  
  64.         Serial.println("Received "+  String(len) + "  bytes:");
  65.         printf("[ ");
  66.         for (int i = 0; i < len; i++) {
  67.             printf("0x%.2X ", (uint8_t)data[i]);
  68.             uart_write_bytes(uart_num, (const char*)&data[i], 1);
  69.             // Add a Newline character if you get a return charater from paste (Paste tests multibyte receipt/buffer)
  70.             if (data[i] == '\r') {
  71.                 uart_write_bytes(uart_num, "\n", 1);
  72.             }
  73.         }
  74.         printf("] \n");
  75.         uart_write_bytes(uart_num, "]\r\n", 3);
  76.     } else {
  77.         // Echo a "." to show we are alive while we wait for input
  78.         uart_write_bytes(uart_num, ".", 1);
  79.     }
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement