2016年

3月

24日

Arduino シリアル通信で文字列情報の送受信を考える

ArduinoにEthernet シールドを取り付けてシリアル通信で文字列情報の送受信を考える

Arduinoのシリアル通信は基本的に1byteごとにしかポートに来ている情報を読むことができません。
だから、シリアル通信で文字列を渡そうと思ったらなかなか大変です。
そこでシリアル送信側で文字列の最後に終端記号「\0」を送信してもらって、そこまでを読み取るようにします。

WindowsRuntimeの場合このような送信コードで文字列の最後に終端文字を送信します。

cr(\r) LF(\n) CR:0x0d、LF:0x0A

Arduinoスケッチ

char buff[BUFF_MAX]={'\0'};
int counter = 0;
void loop(){ if (Serial.available()>0){ char data = Serial.read(); buff[counter] = data; if (data == '\0'){ //buff[0]~buff[counter-1]までが文字列となってここでうけとれる //シリアル送信側で終端文字\0が最後につけられることが前提 Serial.write(buff); counter = 0; } else{ counter++; } } }

Arduino側では\0を読み込むまではバッファに文字を加えていって、\0を読み込んだら文字列を受け取ったとして処理することとします。

void recvStr(char *buf)
{
  int i = 0;
  char c;
  while (1) {
    if (Serial.available()) {
      c = Serial.read();
      buf[i] = c;
      if (c == '\n') break;
      i++;
    }
  }
  buf[i] = '\0';  // \0: end of string
}

文字列の受信
一定の文字数が受信バッファにたまったら文字数分読み込み、文字列へ格納する場合。

char dat[5];

void setup() {
  Serial.begin(9600);
}

void loop() {
  if (Serial.available() >= 3) {  // 受信バッファに 3文字以上たまったら
    for(int i=0; i<3; i++) {      // for文で 3回ループし
      dat[i] = Serial.read();     // 1バイトずつデータを格納
    }
    dat[3] = '\0';                // データの最後に文字の終端コードを入れる

    Serial.print("DATA = ");
    Serial.println(dat);
  }
}

終了文字を判別し文字列へ格納
char dat[32];   // 格納用文字列
int count = 0;  // 文字数のカウンタ

void setup() {
  Serial.begin(9600);
}

void loop() {
  if (Serial.available()) {
    dat[count] = Serial.read();
    if (count > 30 || dat[count] == '=') {  // 文字数が既定の個数を超えた場合、又は終了文字を受信した場合
      dat[count] = '\0';                    // 末尾に終端文字を入れる
      count = 0;                            // 文字カウンタをリセット
      Serial.print ("Data = ");
      Serial.println(dat);
    } else {
      count++;                              // 文字カウンタに 1 加算
    }
  }
}

 

目 次