醬是創客的ESP32教學主題第13篇,以Ai-Thinker安信可NodeMCU-32S(使用Arduino語言)來實作教學,本篇教學將著重使用ESP32的TTL訊號與TTL(UART) to RS485轉換板發送/接收byte array實作,因為modbus RTU需要送byte,常見的應用是透過Wi-Fi跑modbus TCP轉Modbus RTU。
以下是我們今天的學習目標
- ESP32提供三組UART,Serial、Serial1、Serial2
- Serial使用GPIO1->TX0,GPIO3->RX0,通常用於USB通訊和寫程式debug使用,預設系統使用
- Serial1使用GPIO10->TX1,GPIO9->RX1,通常用於SPI flash上,預設系統未使用
- Serial2使用GPIO17->TX2,GPIO16->RX2,通常用於自行使用,大部分的人都會使用這個,預設系統未使用
- TTL間訊號線長度建議不要過長,可避免突波干擾
- TTL(UART) to RS232轉換器可使用NodeMCU-32S的3.3V或5V DC
- 透過Serial2.write送出Byte
- 透過Serial2.readBytes接收Byte
- RS485接線需接A和B,GND大多都是看狀況接的
設備:
安信可NodeMCU-32S #露天拍賣 #蝦皮購物
TTL485轉換板 #露天拍賣 #蝦皮購物
接線方式:
NodeMCU-32S(3.3V或5V)—-TTL485轉換板(VCC)
NodeMCU-32S(GND)—-TTL485轉換板(GND)
NodeMCU-32S(GPIO10設為TX2)–TTL訊號–TTL485轉換板(RXD)
NodeMCU-32S(GPIO9設為RX2)–TTL訊號–TTL485轉換板(TXD)
TTL485轉換板(A/D+)–線–PC使用PYC U485B(A)
TTL485轉換板(B/D-)–線–PC使用PYC U485B(B)
Buad Rate: 9600,N,8,1
Ai-Thinker安信可NodeMCU-32S的腳位圍(資料來源:安信可)
可選擇的Baud rate: 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200, 256000, 512000, 962100
SERIAL對應模式:
SERIAL_5N1 5-bit No parity 1 stop bit
SERIAL_6N1 6-bit No parity 1 stop bit
SERIAL_7N1 7-bit No parity 1 stop bit
SERIAL_8N1 (預設) 8-bit No parity 1 stop bit
SERIAL_5N2 5-bit No parity 2 stop bits
SERIAL_6N2 6-bit No parity 2 stop bits
SERIAL_7N2 7-bit No parity 2 stop bits
SERIAL_8N2 8-bit No parity 2 stop bits
SERIAL_5E1 5-bit Even parity 1 stop bit
SERIAL_6E1 6-bit Even parity 1 stop bit
SERIAL_7E1 7-bit Even parity 1 stop bit
SERIAL_8E1 8-bit Even parity 1 stop bit
SERIAL_5E2 5-bit Even parity 2 stop bit
SERIAL_6E2 6-bit Even parity 2 stop bit
SERIAL_7E2 7-bit Even parity 2 stop bit
SERIAL_8E2 8-bit Even parity 2 stop bit
SERIAL_5O1 5-bit Odd parity 1 stop bit
SERIAL_6O1 6-bit Odd parity 1 stop bit
SERIAL_7O1 7-bit Odd parity 1 stop bit
SERIAL_8O1 8-bit Odd parity 1 stop bit
SERIAL_5O2 5-bit Odd parity 2 stop bit
SERIAL_6O2 6-bit Odd parity 2 stop bit
SERIAL_7O2 7-bit Odd parity 2 stop bit
SERIAL_8O2 8-bit Odd parity 2 stop bit
Arduino 範例程式碼如下
//醬是創客 開發實作的好夥伴 #include <WiFi.h> #define RXD2 16 #define TXD2 17 byte serial_8_byte_TX_payload[8]; byte serial_8_byte_RX_payload[8]; void setup(void) { Serial.begin(115200); Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2); } void loop(void) { serial2_8byte_tx(); delay(10000); serial2_8byte_rx(); } void serial2_8byte_tx(void){ serial_8_byte_TX_payload[0]++; serial_8_byte_TX_payload[1]++; serial_8_byte_TX_payload[2]++; serial_8_byte_TX_payload[3]++; serial_8_byte_TX_payload[4]++; serial_8_byte_TX_payload[5]++; serial_8_byte_TX_payload[6]++; serial_8_byte_TX_payload[7]++; Serial2.write(serial_8_byte_TX_payload, 8); Serial.println("txtxtx"); for( byte b : serial_8_byte_TX_payload )Serial.println( b, HEX ); } void serial2_8byte_rx(){ if (Serial2.available()){ while (Serial2.available()){ serial_8_byte_RX_payload[0] = 0xff; serial_8_byte_RX_payload[1] = 0xff; serial_8_byte_RX_payload[2] = 0xff; serial_8_byte_RX_payload[3] = 0xff; serial_8_byte_RX_payload[4] = 0xff; serial_8_byte_RX_payload[5] = 0xff; serial_8_byte_RX_payload[6] = 0xff; serial_8_byte_RX_payload[7] = 0xff; Serial2.readBytes(serial_8_byte_RX_payload, sizeof(serial_8_byte_RX_payload)); Serial.println("rxrxrx"); for( byte b : serial_8_byte_RX_payload )Serial.println( b, HEX ); } } }
Arduino 序列埠監控視窗 輸出如下,我們於ESP32傳送8byte的0x0a後,再由電腦的COM port送出8byte的0x78
txtxtx A A A A A A A A rxrxrx 78 78 78 78 78 78 78 78 txtxtx B B B B B B B B