ArduinoにEthernet シールドを取り付けてシリアル通信で文字列情報の受信を考える
Arduinoのシリアル通信は基本的に1byteごとにしかポートに来ている情報を読むことができません。
だから、シリアル通信で文字列を渡そうと思ったらなかなか大変です。
そこでシリアル送信側で文字列の最後に終端記号「\0」を送信してもらって、そこまでを読み取るようにします。
WindowsRuntimeの場合このような送信コードで文字列の最後に終端文字を送信します。
cr(\r) LF(\n) CR:0x0d、LF:0x0A
// 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を読み込んだら文字列を受け取ったとして処理することとします。
▫️参考ページ
A Simple Example (Arduino, MQTT, m2m.io)
RPi + Node.js その3 「Arduinoとシリアル通信」
Arduinoでシリアル通信をしてみよう ~ Arduino LV3 ~
コメントをお書きください