kuroの覚え書き

96の個人的覚え書き

ESP32-WROOM32Eで複数のシリアル通信を行う

他の機器との通信をシリアルポートで行いつつ、他の機器とも通信をしたいということで、通常使用しているシリアルポート以外を使えるようにしたい。
ESP32にはハードウェアシリアルポートが3組用意されており、何も宣言しなくても使える通常使用しているSerialはUART0ということらしい。
他にUART1とUART2があるわけで、どのピンがそうかというとUART1はRXD1:IO9, TXD:IO10でUART2がRXD:IO16, TXD:IO17ということらしい。
IO16,IO17は通常アナログポートじゃないピンなのでいいとしてIO9,IO10はそもそも秋月の基板ではピンが引き出されていない。というのもこれらのピン(IO6~11)は内部的にすでに使われちゃっているからという説明である。
ただし、UART1を別のピンにアサインするという技が使えるらしい。
現在テスト基板ではIO34,IO35,IO32にアナログセンサー接続用のコネクタを付けているので、このポートをシリアル通信に流用しようと試してみたところ、IO34とIO35は

collect2: error: ld returned 1 exit status

というエラーが出て使えないことがわかった。当然ながらIO6~11も使えない。16,17をUART1として使うこともできるがあまり意味はないかな。
のこるIO32は無事使えることがわかった。これだとTxかRxのどちらかしか使えないのだが、やむをえまい。
後はWIFIと共存できないADC2チャンネルのIO25〜27のあたりもシリアル通信ならできるんじゃないかな。

HardwareSerial mySerial1(1);
const int Rx1Pin = 25;
const int Tx1Pin =32;

void setup() {
  Serial.begin(115200); //通常のシリアルポートUART0
  mySerial1.begin(115200, SERIAL_8N1,Rx1Pin,Tx1Pin); //UART1をRXD:25,TXD32に割り付ける
}

void loop() {
  mySerial1.print("Hello worls!");