シリアル通信によりテキストを1行読み込み
arduinoやesp32でシリアル通信により1行分だけ受信します。
受信したテキストをコマンドとして処理することで、マイコン側の動作を変えていくことができます。
#define MAX_LINE_LENGTH 100
static int recptr = 0; //受信した文字数を保存する
static char recv[MAX_LINE_LENGTH]; //受信した文字列を保存する
int receiveCommand(void)
{
int cmd = -1; // -1 受信中 or 受信エラー
//すべての受信データを受け取る
//whileループを抜ける条件はシリアル受信データが無い
while (1) {
int receive_byte = Serial.read();
//受信データが無ければループを抜ける
if (receive_byte == -1) {
cmd = 0;
break;
}
recv[recptr] = receive_byte;
//受信データの終わりをCRまたはLFとする(他の文字にすることも可能)
//CRまたはLFの受信でループを抜ける
if ((recv[recptr] == '\n') || (recv[recptr] == '\r')) {
//'\0'は文字列の終端として認識される
recv[recptr] = '\0';
recptr = 0;
cmd = 0;
break;
} else {
//受信データがある場合は文字列の書込位置を一文字分だけ移動
recptr++;
//MAX_LINE_LENGTHで定義された文字数以上の場合は先頭に戻って上書きする
if (recptr >= MAX_LINE_LENGTH) recptr = 0;
}
}
return cmd;
}
void setup() {
Serial.begin(115200);
}
void loop() {
int cmd;
// コマンドを受信
if (Serial.available() > 0) {
int rdata = receiveCommand();
if (rdata != -1) cmd = rdata;
}
Serial.printf("%s\n", recv);
delay(500);
}
動作確認
arduinoIDEの場合は[CRおよびLF]に設定する必要があります。
こちらを参考にして書き換えています