arduino — シリアル通信で文字列の受信

arduinoのIDEでシリアル通信をする場合は,Serial.read()を使うが,送られてきたデータの最初のBYTEしか読めない(0~255までしか使えない).

そこで,255以上の数字を受信するために,数字を文字列で受信して(当然送信側でも文字列として送信する),後で数字に直すという方法を使う.
arduinoはC,C++ベースなので,atoi()が使えば後で数字に直すのも簡単.

arduino側

C:
  1. void setup(){
  2.   Serial.begin(9600);
  3. }
  4.  
  5. void loop(){
  6.   char str[20]; // 数字(文字列)の受信用配列
  7.  
  8.   // シリアルからのデータ受信
  9.   recvStr(str);
  10.   int aa = atoi(str);
  11. }
  12.  
  13. void recvStr(char *buf)
  14. {
  15.   int i = 0;
  16.   char c;
  17.   while (1) {
  18.     if (Serial.available()) {
  19.       c = Serial.read();
  20.       buf[i] = c;
  21.       if (c == '\0') break; // 文字列の終わりは\0で判断
  22.       i++;
  23.     }
  24.   }
  25.   buf[i] = '\0';
  26. }

送信側でproce55ingを使うとすれば,下のコードみたいな感じで送信する.
文字列の終端を表す\0を付け足しているのがミソ.上のarduino側ではこの\0を目印にして文字列の終わりを判断しているので,両側で同じ文字を目印にしておけば大丈夫.
\0じゃなくて\nとかでもOK.

proce55ing側

JAVA:
  1. import processing.serial.*;
  2. Serial port;
  3.  
  4. void setup()
  5. {
  6.   size(100,100);
  7.   port = new Serial(this, "COM8", 9600);
  8.   port.clear();
  9. }
  10.  
  11. void draw() {
  12.   int poss;
  13.   poss = 1000; // 255以上の数字
  14.   port.write(str(poss)+"\0");
  15.   poss = -1000; // マイナスでもOK
  16.   port.write(str(poss)+"\0");
  17. }

Leave a Reply

You must be logged in to post a comment.