醬是創客的ESP32教學主題第12篇,以Ai-Thinker安信可NodeMCU-32S(使用Arduino語言)來實作教學,本篇教學將著重使用ESP32的TTL訊號與TTL(UART) to RS232轉換板發送/接收byte array實作,越來越多的Serial設備都要求送byte來避免傳ASCII降低效率,常見的應用是透過Wi-Fi來與RS232溝通。

以下是我們今天的學習目標

  • 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

設備:
安信可NodeMCU-32S #露天拍賣 #蝦皮購物
TTL232轉換板 #露天拍賣 #蝦皮購物

接線方式:
NodeMCU-32S(3.3V或5V)—-TTL232轉換板(VCC)
NodeMCU-32S(GND)—-TTL232轉換板(GND)
NodeMCU-32S(GPIO10設為TX2)–TTL訊號–TTL232轉換板(TXD)
NodeMCU-32S(GPIO9設為RX2)–TTL訊號–TTL232轉換板(RXD)
TTL232轉換板(RS232母頭)–RS232線–PC使用PYC U232(RS232公頭)
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