2016年3月11日金曜日

ArduinoのSerial通信を複数ポートで行う方法と注意点


分かったらスッキリだったので、情報を共有します。

目的

ArduinoNANOやArduinoUnoなど、ArduinoMEGAでないArduinoでも複数ポートでシリアル通信がしたい。

方法

同時に通信しないのであれば、SoftwareSerialを使って実現できます。

注意点

SoftwareSerialは複数同時にデータ受信状態になれません

シリアル通信を複数同時に受信状態にしたい場合はArduinoMEGAを使う必要があります。

SoftwareSerialを複数利用する場合、データを受信する前にlisten()を呼ぶ必要があります

listen()でデータを受信するシリアルを切り替えます。
#include <SoftwareSerial .h>

SoftwareSerial soft_serial_1(8, 9);  // rx, tx
SoftwareSerial soft_serial_2(10,11); // rx, tx

uint8_t buff[256];

void setup() {
  soft_serial_1.begin(4800);
  soft_serial_2.begin(9600);
}

void loop() {
  int i;
  int received_data_size = 0;

  // switch to listen soft_serial_1
  soft_serial_1.listen();

  soft_serial_1.println("send me data.");
  for (i = 0; i < 255; i++){
    if (soft_serial_1.available()) {
      buff[received_data_size] = soft_serial_1.read();
      received_data_size++;
    }
  }

  // switch to listen soft_serial_2
  soft_serial_2.listen();
  soft_serial_2.print("I received ");
  soft_serial_2.print(received_data_size);
  soft_serial_2.println(" bytes");
  for (int i = 0; i < received_data_size; i++){
     soft_serial_2.print(buff[i], HEX);
     soft_serial_2.print(" ");
  }
  soft_serial_2.println();

  delay(2000);
}

以上です。
この方法で事足りるのであればArduino代を抑えられます。

参考

Arduino Uno with Multiple Software Serial Devices

参考商品

安いArduinoNANO
5個セットで1600円位でした。
不良品である可能性がまあまああるため、利用する場合は1個ではなく複数購入をお勧めします。
購入から1週間位で届きました。
別途miniBケーブルが必要です。

安いArduinoMEGA
ケーブルがついて2850円でした。
Amazonだったので、注文した翌日に届きました。

更新情報

20161130
begin() end()を度々呼び出すのではなく、データ受信前にlisten()を呼ぶ形式に変更しました。
rx, txの設定が逆だったので、修正しました。

0 件のコメント :

コメントを投稿