arduino — シリアル通信で文字列の受信
arduinoのIDEでシリアル通信をする場合は,Serial.read()を使うが,送られてきたデータの最初のBYTEしか読めない(0~255までしか使えない).
そこで,255以上の数字を受信するために,数字を文字列で受信して(当然送信側でも文字列として送信する),後で数字に直すという方法を使う.
arduinoはC,C++ベースなので,atoi()が使えば後で数字に直すのも簡単.
arduino側
C:
-
void setup(){
-
Serial.begin(9600);
-
}
-
-
void loop(){
-
char str[20]; // 数字(文字列)の受信用配列
-
-
// シリアルからのデータ受信
-
recvStr(str);
-
int aa = atoi(str);
-
}
-
-
void recvStr(char *buf)
-
{
-
int i = 0;
-
char c;
-
while (1) {
-
if (Serial.available()) {
-
c = Serial.read();
-
buf[i] = c;
-
if (c == '\0') break; // 文字列の終わりは\0で判断
-
i++;
-
}
-
}
-
buf[i] = '\0';
-
}
送信側でproce55ingを使うとすれば,下のコードみたいな感じで送信する.
文字列の終端を表す\0を付け足しているのがミソ.上のarduino側ではこの\0を目印にして文字列の終わりを判断しているので,両側で同じ文字を目印にしておけば大丈夫.
\0じゃなくて\nとかでもOK.
proce55ing側
JAVA:
-
import processing.serial.*;
-
Serial port;
-
-
void setup()
-
{
-
size(100,100);
-
port = new Serial(this, "COM8", 9600);
-
port.clear();
-
}
-
-
void draw() {
-
int poss;
-
poss = 1000; // 255以上の数字
-
port.write(str(poss)+"\0");
-
poss = -1000; // マイナスでもOK
-
port.write(str(poss)+"\0");
-
}
Leave a Reply