シリアルポートを使用して、/ dev/ttyUSB0を介してUSBデバイスと通信しようとしています。
これまで、modprobeを使用してUSB0として表示し、chmodを使用してrootでなくても読み取りと書き込みを可能にし、実際に機能するCライブラリ(Gantなどと呼ばれる)を使用しました。
ただし、元々はC#for .Netで開発された既存のアプリケーションと統合したいのですが、(願わくば)間もなくモノラルを使用してLinuxで実行されるようになります。
Cコードはopen("/dev/ttyUSB0")
、ファイル記述子を取得し、USBデバイスと直接通信するためにread()
使用します。write()
私が見る限り、C#での同等のものは次のようになります
SerialPort sp = new SerialPort("/dev/ttyUSB0");
sp.Open();
しかし、それはIOException: Invalid argument at System.IO.Ports.SerialPortStream.SetSignal (SerialSignal signal, Boolean value) [0x00000] in <filename unknown>:0
のさまざまな引数のセットを試しnew SerialPort()
、その後、次のようなもので値を設定しましsp.BaudRate = 115200
たが、実際にエラーを引き起こしている原因がわからないため、さまざまな組み合わせを試すだけで、かなり幸運に並べ替える必要があります。
monoのソースコードを少し掘り下げると、エラーを生成する関数が呼び出されているように見えます。set_signal (fd, signal, value)
set_signalは外部であり、次のように宣言されます。
[DllImport ("MonoPosixHelper", SetLastError = true)]
static extern int set_signal (int fd, SerialSignal signal, bool value);
私が理解しているように、fdはCコードのようなファイル記述子であり、SerialSignalは列挙型です。
enum SerialSignal {
None = 0,
Cd = 1, // Carrier detect
Cts = 2, // Clear to send
Dsr = 4, // Data set ready
Dtr = 8, // Data terminal ready
Rts = 16 // Request to send
}
ブール値value
は、特定のSerialSignalが設定されるかどうかです。
Dtrを設定するために1回、Rtsを設定するために1回、合計2回呼び出されるようです。
結局のところ、私の質問はまだなぜこれが失敗するのですか?DTRとRTSのデバイス固有の設定が正しくない可能性がありますか?モノラルコードを完全にバイパスし、いくつかのC外部を使用することは機能しますか(これは、モノラルソースが十分に低レベルになったら、とにかく行うと思います)。C#モノラルプロジェクト内からいくつかのCコードを使用できますか?
私はCコードを使用しているので、最後のコードが最も簡単なルートになると思いますが、それでもここで何が問題なのかを理解したいと思います。