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