Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

PC版のSerialPortアプリで動いて組み込み機器で動かない場合、timeoutまわりを疑ってみる

とある案件で、組み込み機器で通信を受けて彼是するアプリを開発した事があります。
いわゆる組み込みLinux関係でしかもdebianだったので楽勝だろーとrubyのSerialPort系gemをつくってチャッチャッとつくってみました。

……ところが。
いざ、本番環境の機器で試すとうまくいかない。
たとえば、

loop do
  printf "."
  sp.read
  #...
end

なんて伝統のprintfデバッグをやってみると、本来ならドットで画面が埋め尽くされてるはずが
実際には一個だけプロットされて動かない。
……つまり受信待機中なわけです。

同じdebian系OSを採用しているのに、これはいかに?
一応、PC版はUSBドングル、組み込み番は良くあるドーターボードソケットという違いはありましたが。

こんな時は、読み込み時間制限まわりを疑ってみましょう。

sp = SerialPort.new 115200, 8, 0, SerialPort::None
sp.read_timeout = 50

と50ミリ秒に設定してあげたら、動きました。
USBドングル版では石が宜しくやってくれていた所を自前でフォローする必要があったわけですね。
久しく組み込みから離れていたので感覚が抜けてました。