4

我有一个来自 u-blox.com 的 GPS,带有 USB 连接和驱动程序。驱动程序安装了一个虚拟 COM 端口,当您插入 USB 时会弹出该端口。使用超级终端,我可以观察来自 GPS 的数据流。

然后我要我程序里的数据,没那么容易...

我已经实现了一些使用 serialPort 类从 GPS 读取的方法,但没有成功。我之前用 C# 编写了几个串行设备读取器和写入器,但这一个阻止了我。

例如,simpleSerial中的简单代码不会给您任何东西,除非您拔下并重新插入 USB。

尝试使用 matlab 阅读它,效果很好,但是由于我需要 GPS 数据的程序的其余部分是在 c# 中,这并不能完全解决问题。

我可以绕过 serialPort 类中发生的一些高级 C# 事情吗?或者在读取 USB 串行端口时是否存在任何已知问题,我认为它就像我的 GPS 一样工作?

4

9 回答 9

1

如果您可以使用超级终端与 GPS 通信,那么原则上您没有理由不能在 C# 中进行通信。您确定您已正确配置串行端口,尤其是波特率、数据位、停止位、奇偶校验和流控制设置吗?

您可以使用SysInternals PortMon工具查看低级 I/O 并比较超级终端和您的 C# 程序如何配置串行端口。也许这会提供一些有用的信息。

于 2008-11-12T22:02:15.433 回答
1

我已经成功地将 .Net 2 中的 SerialPort 类与虚拟 comport 上的 gps 一起使用。看来您的虚拟 comport 驱动程序有点不对劲。如果您找不到更新的驱动程序,我建议您调用 WinAPI 函数来读取串行端口。

例如看一下这段代码:http: //www.codeproject.com/KB/system/SerialPortComm.aspx

于 2008-11-12T22:12:17.613 回答
1

从 u-blox 支持获得此信息。

以下十六进制命令将强制 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 回答
0

不确定这是否与您遇到的问题相同。

我注意到如果 RX_FLAG 与 SetCommMask API 一起使用,GetOverlappedResult 似乎不会在第一个 WaitCommEvent 之后返回。看起来 API 正在等待某些事情发生,直到重置 com 掩码(至少这是我观察到的)。但是,如果您去读取端口,仍然会收到一些数据,之后设备不再响应。在这种情况下,您需要拔下并重新插入设备以使其再次响应。

但是,如果改为使用 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 回答
0

U-Blox GPS 遇到了同样的问题,但通过启用 DTR 和 RTS 属性设法解决了这个问题。现在我可以很好地阅读 NMEA 句子了。我发现的一个问题是我仍然需要不时将我的 GPS 移除并重新插入 USB 端口。希望能帮助到你。

于 2009-03-18T07:57:34.830 回答
-1

我在正在编写的应用程序中遇到了类似的问题,问题结果是我试图向我们SerialPort.WriteLine发送 a\r\n来结束行,而我真的需要发送\n. 当我切换到末尾附加SerialPort.Write一个\n时,一切都像在超级终端中一样工作。

于 2008-11-13T02:36:37.097 回答
-1

尝试使用握手/流量控制。它们在使用 USB 串行适配器时也很有用。

于 2010-08-22T19:57:06.277 回答