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