2016年

3月

24日

Arduino シリアル通信 buffコーティング例

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

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

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

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

Arduinoスケッチ


// handles message arrived on subscribed topic(s)
void callback(char* topic, byte* payload, unsigned int length) {

  int i = 0;

  //Serial.println("Message arrived:  topic: " + String(topic));
  //Serial.println("Length: " + String(length,DEC));
  
  // create character buffer with ending null terminator (string)
  for(i=0; i<length; i++) {
    message_buff[i] = payload[i];
  }
  message_buff[i] = '\0';
  
  String msgString = String(message_buff);
  
  //Serial.println("Payload: " + msgString);
  
  if (msgString.equals("{\"command\":{\"lightmode\": \"OFF\"}}")) {
    senseMode = MODE_OFF;
  } else if (msgString.equals("{\"command\":{\"lightmode\": \"ON\"}}")) {
    senseMode = MODE_ON;
  } else if (msgString.equals("{\"command\":{\"lightmode\": \"SENSE\"}}")) {
    senseMode = MODE_SENSE;
  }
}

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

 

目 次