4

USB接続とドライバーを備えたu-blox.comのGPSを持っています。ドライバーは、USBを接続するとポップアップする仮想COMポートをインストールします。ハイパーターミナルを使用して、GPSからのデータの流れを監視できます。

次に、プログラムにデータが必要ですが、それほど簡単ではありません...

シリアルポートクラスを使用してGPSから読み取るいくつかのメソッドを実装しましたが、失敗します。私は以前にC#でいくつかのシリアルデバイスのリーダーとライターをプログラムしましたが、これは私を止めます。

例として、simpleSerialの単純なコードは、USBを抜き差ししない限り、何も提供しません。

matlabで読んでみましたが、これはうまく機能しますが、GPSデータを必要とする私のプログラムの残りの部分はc#であるため、問題は完全には修正されません。

回避できるserialPortクラスで起こっている高レベルのC#のことはありますか?または、GPSのように機能すると思われるUSBシリアルポートの読み取りに既知の問題はありますか?

4

9 に答える 9

1

ハイパーターミナルを使用して GPS と通信できる場合、原則として、C# で通信できない理由はありません。シリアル ポート、特にボー レート、データ ビット、ストップ ビット、パリティ、およびフロー制御の設定を正しく構成しましたか?

SysInternals PortMonツールを使用して低レベルの I/O を調べ、ハイパーターミナルと C# プログラムがそれぞれシリアル ポートを構成する方法を比較できます。たぶん、これはいくつかの有用な情報を提供します。

于 2008-11-12T22:02:15.433 に答える
1

これは u-blox サポートから入手しました。

次の 16 進コマンドは、GPS モジュールのウォッチドッグ リセットを強制します。

B5 62 06 04 04 00 00 00 00 00 0E 64

これは、GPS 内の ARM7 uP の低レベル コマンドです。すべての u-blox GPS 受信機で動作します。

byte[] data = new byte[]{0xB5, 0x62, 0x06, 0x04, 0x04, 0x00,
                         0x00, 0x00, 0x00, 0x00, 0x0E, 0x64}; 
sp.Write(data, 0, data.Length);

わたしにはできる。

于 2009-08-26T21:05:48.333 に答える
1

私は.Net 2のSerialPortクラスを仮想comportのgpsでもうまく使用しました。仮想コンポート ドライバーが少しずれているようです。新しいドライバーが見つからない場合は、WinAPI 関数を呼び出してシリアル ポートを読み取ることをお勧めします。

たとえば、次のコードを見てください: http://www.codeproject.com/KB/system/SerialPortComm.aspx

于 2008-11-12T22:12:17.613 に答える
0

U-Blox GPS で同じ問題が発生しましたが、DTR および RTS プロパティを有効にすることで解決できました。これで、NMEA の文章を問題なく読めるようになりました。私が見つけた問題の 1 つは、GPS を時々取り外して USB ポートに再接続する必要があることです。それが役に立てば幸い。

于 2009-03-18T07:57:34.830 に答える
0

これが発生している問題と同じかどうかはわかりません。

RX_FLAG を SetCommMask API で使用すると、最初の WaitCommEvent の後に GetOverlappedResult が返されないように見えることに気付きました。com マスクがリセットされるまで、API は何かが起こるのを待っているように見えます (少なくともそれは私が観察したことです)。ただし、ポートを読み取ってからデータを受信すると、デバイスは応答しなくなります。このシナリオでは、デバイスが再び応答するようにするには、デバイスのプラグを抜いてから再度差し込む必要があります。

ただし、代わりに RX_CHAR を使用すると、GetOverLappedResult は正しいステータスを返し、デバイスは正常に動作します。

この情報がお役に立てば幸いです。

于 2008-12-02T03:48:27.173 に答える
0

問題は、USB シリアル ポート ドライバーまたは Microsoft の SerialPort クラスの実装にバグがあることです。私は、Prolific 製のチップ (および Prolific 製のドライバー) を使用する USB - シリアル アダプターでまったく同じ問題を抱えていました。

問題を正確に絞り込むことはできませんでしたが、.NET Framework のソースコードが利用可能になったので、SerialPort に足を踏み入れて、問題が正確に何であるかを確認しようとしています。

回避策は、別のシリアル アクセス クラスを使用することです。.Net 2.0 より前に、私は SerialStream クラスを作成していましたが、何らかの理由で、SerialPort クラスが動作しないこれらの同じ USB シリアル アダプターで正常に動作するようです。

http://www.6bit.com/download/SerialStream.zipで私のクラスを取得できます。私は何年にもわたってこの同じコードを仲間の GPS プログラマーに提供しており、彼らもそれで成功しています。

于 2009-02-27T03:45:45.587 に答える
0

次のコードを使用して、USB経由でArduinoと通信しました。Arduinoからバイトを送受信します。シンプルで、GPS と通信していませんが、何らかの形で役立つことを願っています!

    public static byte ReadByte()
    {
        byte byteRead = new byte();
        SerialPort port = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);
        port.Open();
        int byteValue = port.ReadByte();
        port.Close();

        byteRead = Convert.ToByte(byteValue);

        return byteRead;
    }

    public static void SendByte(byte packet)
    {
        SerialPort port = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);
        port.Open();
        byte[] writeByte = new byte[1];
        writeByte[0] = packet;
        port.Write(writeByte, 0, 1);
        port.Close();
    }
于 2009-02-27T03:53:33.353 に答える
-1

ハンドシェイク/フロー制御を使用してみてください。また、USB シリアル アダプタを使用する場合にも役立ちます。

于 2010-08-22T19:57:06.277 に答える
-1

私が書いていたアプリケーションで同様の問題に遭遇しました。問題はSerialPort.WriteLine\r\n本当に\n. SerialPort.Write最後にa を追加して切り替えると\n、すべてがハイパーターミナルのように機能しました。

于 2008-11-13T02:36:37.097 に答える