ESP32
ESP-WROOM-32

Arduino-ESP32 Serial通信

WROOM-32のArduino開発環境でシリアル通信を行う方法を確認します。
必要な事項は以下です。

(1) シリアル通信のハードウェアピンの接続
(2) Arduinoライブラリ Serialを使ったプログラム

(1) シリアル通信のハードウェアピンの接続

ハードウェアのピン配置については
EPS32と使用するモジュールのドキュメントのUARTを確認します。
UARTは0,1,2の3系統があります。

UART0 ( デフォルト RX=GPIO3, TX=GPIO1 )
WROOM_UART_0_PIN.png
UART1 ( デフォルト RX=GPIO9, TX=GPIO10 ) ※WROOM32では、デフォルトでは使用不可
WROOM_UART_1_PIN.PNG
UART2 ( デフォルト RX=GPIO16, TX=GPIO17 )
WROOM_UART_2_PIN.png

http://ht-deko.com/arduino/esp-wroom-32.html#18
上記を参考にしますと、UART1はデフォルトのピン(IO9,10)では使用不可なので、UART1を使用する際には使用するピンを変更して使用するようです。

<20180209追記>
UART1の動作確認しました。
使用する場合は、
(1) HardwareSerial Serial1(1); を定義して、
(2) Serial1.begin(115200, SERIAL_8N1, 33, 34); をsetup()で実行することで、使用可能になります。
上記はRX=33, TX=34の例ですので、引数で使用したいGPIOの番号を指定できます。(IO6~IO11, IO34, IO35は使用不可)

begin()関数の詳細はgithubのここを確認してください。
<20180209追記 end>

今回はUART2を使用して確認します。

(2) シリアル通信のハードウェアピンの接続

Arduinoでのシリアル通信はSerialというライブラリを使用します。

ArduinoのSerial ライブラリ ドキュメント
https://www.arduino.cc/en/Reference/Serial
日本語の解説
https://garretlab.web.fc2.com/arduino_reference/language/functions/communication/serial/findUntil.html

Serialの送受信のサンプルは[MultiSerial]がSDKのサンプルに入っています。
https://github.com/arduino/Arduino/blob/master/build/shared/examples/04.Communication/MultiSerial/MultiSerial.ino

以下を参考にESP32のUART2(IO16,IO17)を使うように設定します。
http://taltalp.hatenablog.jp/entry/2017/05/12/153509

HardwareSerial Serial1(2);

void setup() {
  // initialize both serial ports:
  Serial.begin(115200);
  Serial1.begin(115200);
}

void loop() {
  // read from port 1, send to port 0:
  if (Serial1.available()) {
    int inByte = Serial1.read();
    Serial.write(inByte);
  }

  // read from port 0, send to port 1:
  if (Serial.available()) {
    int inByte = Serial.read();
    Serial1.write(inByte);
  }
}

受信したデータがAsciiの場合は、Serial.write(inByte);とすることで、文字が出力されます。

サンプルの関数Serial.read()は1byteを読み込みします。
また、Serial.avialable()は、取得可能なバイト数を確認できます。

Additional UART
http://hackaday.com/2017/08/17/secret-serial-port-for-arduinoesp32/
こちらのリンクだと、ライブラリ側のピン設定を変更してUART1を使えるようにしているようです。