ORSSerialPortを使用して OSX コントロール アプリケーションを書き直しています。場合によっては、自分のマシンに直接接続されていないシリアル デバイスを制御したり、テストのためにそのようなデバイスの通信をローカルでモックしたりしたいと考えています。socatを使用すると、仮想シリアル ポートを作成できます。たとえば、実際のシリアル デバイスからローカルまたはネットワーク経由で通信を行うことができます。
たとえば、ここでは仮想デバイスのペアを作成し、次のようにし/dev/master
ます/dev/slave
。
sudo socat -d -d -d -d -lf /tmp/socat pty,link=/dev/master,ixoff=0,ixon=0,ispeed=9600,ospeed=9600,echo=0,crtscts=0,user=gerwin,group=staff pty,link=/dev/slave,rawer,echo=0,user=gerwin,group=staff
このようなセットアップを使用すると、pySerial を使用して仮想ポートに接続できます。ただし、ORSSerialPort を使用してもうまくいきませんでした。
コードをステップ実行すると、これは「仮想」デバイスがレーダーに表示されない IOKit のみに依存する ORSSerialPort に起因するようです。また、パスを使用してインスタンスを初期化する場合、たとえば/dev/master
、対応するインスタンスio_object_t
が存在しない場合、初期化は nil を返します。
IOKit とカーネルの詳細については避けたいと思います (ここで提案されているように)。
コードを見ると、sendData はファイル記述子に書き込みます。ORSSerialPort を「プレーン」ファイル記述子で初期化し、詳細な ioctl 設定をスキップし、これをプレーン文字ストリームとして扱う方法がある可能性はありますか (これが pySerial の方法であると仮定します)。代替案はありますか?
2016 年 2 月 10 日更新:
この状況について、ORSSerialPort github issue listで作成者の armadsen と話し合いました。
基本的なアプローチは、InternalSerialPort と SerialPort の初期化子を「交換」して、パス初期化子が指定/必須のものになり、IOKit 初期化子がオプションのものになるようにすることだと思います。ファイル記述子を取得し、ポートとの間で読み取り/書き込みを行うために、パス (io_object_t ではない) が内部的に使用されていることは既に (ご指摘のとおり) です。つまり、これがそれほど複雑な変更ではないことを願っています。
以下に最終結果への回答を投稿しました...