1

シリアルポートを使用して、/ 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コードを使用しているので、最後のコードが最も簡単なルートになると思いますが、それでもここで何が問題なのかを理解したいと思います。

4

1 に答える 1

1

あなたのコメントを読んだ後: はい、問題なく C コードを呼び出すことができます。ここにはたくさんの例があります。UnixStreamそれにもかかわらず、次のような方法でクラスを使用することもできます。

using System;
using Mono.Unix.Native;
using Mono.Unix;

namespace Test719
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            var fd = Syscall.open("/dev/ttyUSB0", OpenFlags.O_RDWR);
            var stream = new UnixStream(fd);

            stream.ReadByte(); // and so on
        }
    }
}

それがあなたを助けることを願っています。

于 2013-02-06T10:08:37.303 に答える