Japaninoとシリアル通信してみる
PCからシリアル経由でJapaninoのLEDを制御してみた。
int ledPin = 13; // LED connected to digital pin 13 void setup() { pinMode(ledPin, OUTPUT); Serial.begin(9600); } int serial_gets(char *buffer, int size) { if (!Serial.available()) return 0; int i = 0; while (i < size-1) { if (Serial.available()) { buffer[i++] = Serial.read(); if (buffer[i-1] == '\r') { i--; } if (buffer[i-1] == '\n') { i--; break; } } else { delay(1); } } buffer[i] = '\0'; return i; } void loop() { char buffer[16]; if (serial_gets(buffer, 16) > 0) { if (strcmp(buffer, "led:on") == 0) { digitalWrite(ledPin, HIGH); } else if (strcmp(buffer, "led:off") == 0) { digitalWrite(ledPin, LOW); } else if (strcmp(buffer, "led?") == 0) { Serial.println(digitalRead(ledPin), DEC); } } }
serial_getsでPCから送られてくる文字列を取得している。取得した文字列をstrcmpで比較して、"led:on"ならばLEDを点灯、"led:off"ならばLEDを消灯、"led?"ならばLEDの出力状態を取得して送信するようにしている。
PC側のプログラムはrubyで書いてみた。シリアル通信にはruby-serialportを使うのでインストールしておく。
sudo gem install ruby-serialport
#!/usr/bin/env ruby require 'rubygems' require 'serialport' sp = SerialPort.new('/dev/ttyUSB0', 9600, 8, 1, SerialPort::NONE) sleep 2 def serial_gets(sp) str = "" while true do c = sp.getc unless c.nil? str << c break if c.chr == "\n" end end str end begin while true sp.puts "led:on" sleep 1 sp.puts "led:off" sleep 1 sp.puts "led?" puts serial_gets(sp) end rescue Interrupt sp.close puts end