1

ORSSerialPortを使用して OSX コントロール アプリケーションを書き直しています。場合によっては、自分のマシンに直接接続されていないシリアル デバイスを制御したり、テストのためにそのようなデバイスの通信をローカルでモックしたりしたいと考えています。socatを使用すると、仮想シリアル ポートを作成できます。たとえば、実際のシリアル デバイスからローカルまたはネットワーク経由で通信を行うことができます。

たとえば、ここでは仮想デバイスのペアを作成し、次のようにし/dev/masterます/dev/slavesudo 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 ではない) が内部的に使用されていることは既に (ご指摘のとおり) です。つまり、これがそれほど複雑な変更ではないことを願っています。

以下に最終結果への回答を投稿しました...

4

1 に答える 1

0

2016 年 2 月 10 日更新:

この状況について、ORSSerialPort github issue listで作成者の armadsen と話し合いました。

基本的なアプローチは、InternalSerialPort と SerialPort の初期化子を「交換」して、パス初期化子が指定/必須のものになり、IOKit 初期化子がオプションのものになるようにすることだと思います。ファイル記述子を取得し、ポートとの間で読み取り/書き込みを行うために、パス (io_object_t ではない) が内部的に使用されていることは既に (ご指摘のとおり) です。つまり、これがそれほど複雑な変更ではないことを願っています。

この後、「ファイル記述子のみ」で機能する概念実証の実装を作成しました。これは次のsocat場所にあります。

https://github.com/gerwindehaan/ORSSerialPort/tree/3.0

于 2016-02-10T13:48:11.703 に答える