Arduinoのシリアル通信で"\n"まで1行受信するプログラムです。関数loop(){}内で毎回呼び出します。受信していない場合はブロックせずに終了して戻り値が-1になります。また、"\n"まで受信していない場合も戻り値-1で終了します。
プログラム
#include <errno.h> void setup() { Serial.begin(115200); while (!Serial); } void loop() { int cmd; if (Serial.available() > 0) { // 受信したデータが存在する int rdata = receiveCmd(); // コマンドを受信 if (rdata != -1) cmd = rdata; // -1 受信中 or 受信エラー } delay(100); } int receiveCmd(void) { int cmd = -1; // -1 受信中 or 受信エラー static int recptr = 0; //受信した文字数を保存する static char recv[32]; //受信した文字列を保存する while (1) { //すべての受信データを受け取る int receive = Serial.read(); if (receive == -1) break; //受信データなし ループを抜ける recv[recptr] = receive; if ((recv[recptr] == '\n') || (recv[recptr] == '\r')) { recv[recptr] = '\0'; recptr = 0; char *ptr; long rcvdata = strtol(recv, &ptr, 10); //文字列を整数に変換 if (recv[0] == '\0') break; //空行 if (errno != 0 ) break; //エラー発生 if (*ptr != '\0') break; //エラー発生 cmd = rcvdata; } else { recptr++; if (recptr > 30) recptr = 0; //バッファーオーバーフロー対策 } } return cmd; }
ブログを拝見しました。弊社のラズベリーパイ4bレビューブログ記事を書きしてくれませんか。
こちらは無料でサンプルを提供します。
連絡メールはjp02@vertue.cnです。
御返事お待ちしております。どうぞよろしくお願いします。