SoftwareSerialを複数使いするならMultiUARTライブラリーを使え！！

Arduino UNOの複数使いを考えていて
CANかRS485でつなぐのが理想だと思いますが
部品増えるのが面倒なのでSoftwareSerialの複数使いを試してみた

![WS000418.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51752/f0668471-6db2-4a30-d4cf-397bbfbbd7d4.png)


プログラムして試してみると
WRITEは３つとも行うが
READは１つしかできない
色々試してみたが解決せず
ChatGPTに聞いてもダメ
次に
FacebookグループのArduinoファンに書き込みしてみた
https://www.facebook.com/groups/1547944695219684
すると早速コメントが2つついた
1つはElegoo製のArduinoボードを使うと良いよって記事の紹介
https://burariweb.info/electronic-work/arduino-learning/arduino-software-serial.html?fbclid=IwAR2FyxVfcnv3DARzlA9AH2T4w-ViGQSuUBsogZj6wfCZnMn9rEHuQAatrB0#i-6

もう一つはMultiUARTライブラリーについて書いてるGitHubの紹介
https://github.com/askn37/MultiUART?fbclid=IwAR39XSGLSpPVSvyCaKQMv0IzJT-iLSLIIBCRu3D4XBmgcnhUwk7AnaVl0Hk

ボード買うのは金も時間もかかるので
最終手段としてGitHubで紹介している
MultiUARTライブラリーを試すことにした

## 注意事項
MultiUARTのReadmeにかいてある注意事項を抜粋

１．ただし4つのUARTが、必ずしも同時に、完全に、扱えるとは限らない。 
　　MCUの処理能力（CPUクロックや割込頻度）によっては受信データの欠落が発生しうる。
　 合算帯域は 38400 を超えるべきではない。

２．ボーレートのより高い UARTデバイスには優先的に begin() を発行して利用開始することが望ましい。 
　　ただし stopListening() と listen() を繰り返したのちの、優先保証はされない。

３．指定可能なボーレート
　　begin() に指定できるボーレートは、通常の使用範囲では 9600(bps)が最大である。
　　実用上の最小値は 768(bps)で、その間には 19200 の約数が指定できる。

    ボーレートの値は下記の13種類
    9600 6400 4800 3840 3200 2400 1920 1600 1280 1200 960 800 768
　
　※HOさんのアドバイスにより追記

## 導入までの手順
１．README.mdファイル内にある
　　Arduino IDE への導入部分のClick hereをクリックし
　　ZIPアーカイブをダウンロードする。
２．ライブラリマネージャで読み込む
　※ライブラリーの管理で検索しても出てきませんでした。
３．スケッチ


## プログラム

３つのシリアルのピンは
SPI,I2C,INT0,INT1を追加で使うことを想定して下記の通りにした

```
MultiUART mySerial1(4, 5); // RX, TX
MultiUART mySerial2(6, 7); // RX, TX
MultiUART mySerial3(8, 9); // RX, TX
```
ポートレートは最大9600と書いてたのですべて9600にした

```
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // Set baud rate for SoftwareSerial ports
  mySerial1.begin(9600);
  mySerial2.begin(9600);
  mySerial3.begin(9600);

```
実際に試したプログラムも備忘録として残します。

```
#include <MultiUART.h>

MultiUART mySerial1(4, 5); // RX, TX
MultiUART mySerial2(6, 7); // RX, TX
MultiUART mySerial3(8, 9); // RX, TX

void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // Set baud rate for SoftwareSerial ports
  mySerial1.begin(9600);
  mySerial2.begin(9600);
  mySerial3.begin(9600);
}

void loop() // run over and over
{
  // Check if there is any data available on the main serial port
  if (Serial.available()) {
    // Read the data
    char data = Serial.read();

    // Write the same data to the three SoftwareSerial ports
    mySerial1.write(data);
    mySerial2.write(data);
    mySerial3.write(data);
  }

  // Check if data is available to read from the SoftwareSerial ports
  // and print to the main serial monitor
  if (mySerial1.available()) {
    char data1 = mySerial1.read();
    Serial.print("Data on MultiUART1: ");
    Serial.println(data1);
  }

  if (mySerial2.available()) {
    char data2 = mySerial2.read();
    Serial.print("Data on MultiUART2: ");
    Serial.println(data2);
  }

  if (mySerial3.available()) {
    char data3 = mySerial3.read();
    Serial.print("Data on MultiUART3: ");
    Serial.println(data3);
  }
}

```

## 動作テスト
動作テストは同じボードを2つ、PC2台を用意して
すべての組み合わせを行った
結果３つのシリアルポートで読み込めた

![WS000416.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51752/67b065ca-87d9-621d-fd9a-742eb71da268.png)

## 最後に
最近はChatGPT４でプログラムもしていて
今回の件も聞いてみても答えは出なかった
先人の知恵を借りることになりました。
早めにあきらめてArduinoファンで聞いたことで
沼にはまる直前で回避できました。（ちょっとはまってたかも？）
教えていただいたKAさんに感謝です。
viva緩いつながり