Cocoa/Objective-CとArduinoのシリアル通信

普通にシステムコールを使ったシリアル通信で、Arduinoがセンサ情報送信 -> Cocoa側で受信はできていたんだけど、Cocoa側から送信ができずに2日ほど悩んでしまった。write関数で「Resource temporarily unavailable」とエラーが発生する。


ProcessingやArduinoのシリアルモニタでは問題なく送信ができるから、ファイルディスクリプタの設定の問題かと思って色々調べてるうちに、ズバリCocoa/Objective-Cで実装されたArduino用シリアルモニタのようなのが公開されているのを発見。(一番下のXCode Projectをダウンロード)
http://www.arduino.cc/playground/Interfacing/Cocoa



コードを読むとIOKitを使って何やら設定してるみたい。シリアル通信でもIOKitって使うことあるんだ…
とりあえず参考にしてread/writeの処理を書いてみたところ、ちょっと引っかかったのが、今までデバイスファイル名に指定してた「/dev/tty.usbserial-xxxxxxxxx」だとwrite関数呼んだとこで処理が止まる。でも「/dev/cu.usbserial-xxxxxxxxx」を指定するとちゃんと送受信できるってとこ。


この2つの違いを意識してなかったんだけど何が違う?
ttyの方で動かないのはうちの環境が何かおかしいのかも。
Arduinoでスケッチをuploadする時はttyの方を指定してるし、Processingで送受信を試した時もttyの方で動いてるんだけど…