WS_Serial.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #include "WS_Serial.h"
  2. #include <algorithm>
  3. HardwareSerial lidarSerial(1); // Using serial port 1
  4. uint8_t data[][8] = { // ESP32-S3-Relay-6CH Control Command (RS485 receiving data)
  5. { 0x06, 0x05, 0x00, 0x01, 0x55, 0x00, 0xA2, 0xED }, // ESP32-S3-Relay-6CH CH1 Toggle
  6. { 0x06, 0x05, 0x00, 0x02, 0x55, 0x00, 0x52, 0xED }, // ESP32-S3-Relay-6CH CH2 Toggle
  7. { 0x06, 0x05, 0x00, 0x03, 0x55, 0x00, 0x03, 0x2D }, // ESP32-S3-Relay-6CH CH3 Toggle
  8. { 0x06, 0x05, 0x00, 0x04, 0x55, 0x00, 0xB2, 0xEC }, // ESP32-S3-Relay-6CH CH4 Toggle
  9. { 0x06, 0x05, 0x00, 0x05, 0x55, 0x00, 0xE3, 0x2C }, // ESP32-S3-Relay-6CH CH5 Toggle
  10. { 0x06, 0x05, 0x00, 0x06, 0x55, 0x00, 0x13, 0x2C }, // ESP32-S3-Relay-6CH CH6 Toggle
  11. { 0x06, 0x05, 0x00, 0xFF, 0xFF, 0x00, 0xBD, 0xBD }, // ESP32-S3-Relay-6CH ALL ON
  12. { 0x06, 0x05, 0x00, 0xFF, 0x00, 0x00, 0xFC, 0x4D }, // ESP32-S3-Relay-6CH ALL OFF
  13. };
  14. uint8_t Send_Data[][8] = { // Modbus RTU Relay Control Command (RS485 send data)
  15. { 0x01, 0x05, 0x00, 0x00, 0x55, 0x00, 0xF2, 0x9A }, // Modbus RTU Relay CH1 Toggle
  16. { 0x01, 0x05, 0x00, 0x01, 0x55, 0x00, 0xA3, 0x5A }, // Modbus RTU Relay CH2 Toggle
  17. { 0x01, 0x05, 0x00, 0x02, 0x55, 0x00, 0x53, 0x5A }, // Modbus RTU Relay CH3 Toggle
  18. { 0x01, 0x05, 0x00, 0x03, 0x55, 0x00, 0x02, 0x9A }, // Modbus RTU Relay CH4 Toggle
  19. { 0x01, 0x05, 0x00, 0x04, 0x55, 0x00, 0xB3, 0x5B }, // Modbus RTU Relay CH5 Toggle
  20. { 0x01, 0x05, 0x00, 0x05, 0x55, 0x00, 0xE2, 0x9B }, // Modbus RTU Relay CH6 Toggle
  21. { 0x01, 0x05, 0x00, 0x06, 0x55, 0x00, 0x12, 0x9B }, // Modbus RTU Relay CH7 Toggle
  22. { 0x01, 0x05, 0x00, 0x07, 0x55, 0x00, 0x43, 0x5B }, // Modbus RTU Relay CH8 Toggle
  23. { 0x01, 0x05, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x4A }, // Modbus RTU Relay ALL ON
  24. { 0x01, 0x05, 0x00, 0xFF, 0x00, 0x00, 0xFD, 0xFA }, // Modbus RTU Relay ALL OFF
  25. };
  26. uint8_t buf[20] = {0}; // Data storage area
  27. void SetData(uint8_t* data, size_t length) {
  28. lidarSerial.write(data, length); // Send data from the RS485
  29. }
  30. void ReadData(uint8_t* buf, uint8_t length) {
  31. uint8_t Receive_Flag = 0;
  32. Receive_Flag = lidarSerial.available();
  33. if (Receive_Flag >= length) {
  34. lidarSerial.readBytes(buf, length);
  35. char printBuf[length * 3 + 1];
  36. sprintf(printBuf, "Received data: ");
  37. for (int i = 0; i < length; i++) {
  38. sprintf(printBuf + strlen(printBuf), "%02X ", buf[i]);
  39. }
  40. printf(printBuf);
  41. /*************************
  42. Add a receiving data handler
  43. *************************/
  44. Receive_Flag = 0;
  45. memset(buf, 0, sizeof(buf));
  46. }
  47. }
  48. void RS485_Analysis(uint8_t *buf)
  49. {
  50. switch(buf[1])
  51. {
  52. case Extension_CH1:
  53. SetData(Send_Data[0],sizeof(Send_Data[0]));
  54. printf("|*** Toggle expansion channel 1 ***|\r\n");
  55. break;
  56. case Extension_CH2:
  57. SetData(Send_Data[1],sizeof(Send_Data[1]));
  58. printf("|*** Toggle expansion channel 2 ***|\r\n");
  59. break;
  60. case Extension_CH3:
  61. SetData(Send_Data[2],sizeof(Send_Data[2]));
  62. printf("|*** Toggle expansion channel 3 ***|\r\n");
  63. break;
  64. case Extension_CH4:
  65. SetData(Send_Data[3],sizeof(Send_Data[3]));
  66. printf("|*** Toggle expansion channel 4 ***|\r\n");
  67. break;
  68. case Extension_CH5:
  69. SetData(Send_Data[4],sizeof(Send_Data[4]));
  70. printf("|*** Toggle expansion channel 5 ***|\r\n");
  71. break;
  72. case Extension_CH6:
  73. SetData(Send_Data[5],sizeof(Send_Data[5]));
  74. printf("|*** Toggle expansion channel 6 ***|\r\n");
  75. break;
  76. case Extension_CH7:
  77. SetData(Send_Data[6],sizeof(Send_Data[6]));
  78. printf("|*** Toggle expansion channel 7 ***|\r\n");
  79. break;
  80. case Extension_CH8:
  81. SetData(Send_Data[7],sizeof(Send_Data[7]));
  82. printf("|*** Toggle expansion channel 8 ***|\r\n");
  83. break;
  84. case Extension_ALL_ON:
  85. SetData(Send_Data[8],sizeof(Send_Data[8]));
  86. printf("|*** Enable all extension channels ***|\r\n");
  87. break;
  88. case Extension_ALL_OFF:
  89. SetData(Send_Data[9],sizeof(Send_Data[9]));
  90. printf("|*** Close all expansion channels ***|\r\n");
  91. break;
  92. default:
  93. printf("Note : Non-control external device instructions !\r\n");
  94. }
  95. }
  96. void Serial_Init()
  97. {
  98. // Serial.begin(115200); // Initializing serial port
  99. lidarSerial.begin(115200, SERIAL_8N1, RXD1, TXD1); // Initializing serial port
  100. }
  101. void Serial_Loop()
  102. {
  103. uint8_t Receive_Flag = 0; // Receiving mark
  104. Receive_Flag = lidarSerial.available();
  105. if (Receive_Flag > 0) {
  106. lidarSerial.readBytes(buf, Receive_Flag); // The Receive_Flag length is read
  107. if(Receive_Flag == 8){
  108. uint8_t i=0;
  109. for(i=0;i<8;i++){
  110. bool result = std::equal(std::begin(buf), std::begin(buf) + 8, std::begin(data[i])); // Compare two arrays
  111. if(result){
  112. buf[0] = i+1+48;
  113. Relay_Analysis(buf,RS485_Mode);
  114. break;
  115. }
  116. }
  117. if(i > 7)
  118. printf("Note : Non-instruction data was received - RS485 !\r\n");
  119. }
  120. else{
  121. printf("Note : Non-instruction data was received - RS485 !\r\n");
  122. }
  123. Receive_Flag=0;
  124. memset(buf,0, sizeof(buf));
  125. }
  126. }