与u-blox gps进行C#串行通信

时间:2008-11-12 15:26:05

标签: c# serial-port gps usbserial

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

然后我想要我的程序中的数据,不是那么容易......

我已经使用serialPort类实现了一些从GPS读取的方法,但是没有成功。我之前在C#中编写了几个串口设备读取器和编写器,但是这个让我停下来。

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

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

在serialPort类中是否有一些我可以规避的高级C#事情?或者是否有任何已知的问题,读取USB串行端口,我认为它像我的GPS?

9 个答案:

答案 0 :(得分:1)

如果您可以使用HyperTerminal与GPS通信,那么原则上您没有理由不能使用C#。您确定已正确配置串口,特别是波特率,数据位,停止位,奇偶校验和流量控制设置吗?

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

答案 1 :(得分:1)

我已成功使用.Net 2中的SerialPort类和虚拟comport上的gps。看来你的虚拟comport驱动程序略有偏差。如果找不到更新的驱动程序,我建议您调用WinAPI函数来读取串口。

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

答案 2 :(得分: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);

它对我有用。

答案 3 :(得分:0)

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

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

但是,如果使用RX_CHAR,则GetOverLappedResult将返回正确的状态,并且设备将按正常方式工作。

希望这些信息有所帮助。

答案 4 :(得分:0)

问题是USB串口驱动程序或其SerialPort类的Microsofts实现中存在错误。我使用由Prolific制造的芯片(因此也是Prolific的驱动程序)与USB转串口适配器存在完全相同的问题。

我无法完全缩小问题的范围,但现在.NET Framework源代码可用,我将尝试进入SerialPort,看看问题究竟是什么。

解决方法是使用不同的串行访问类。在.Net 2.0之前,我编写了一个SerialStream类,出于某种原因,它似乎可以正常使用这些相同的USB到串行适配器,而SerialPort类将无法使用它。

你可以在http://www.6bit.com/download/SerialStream.zip抓住我的班级。多年来,我已经为一些GPS程序员提供了相同的代码,他们也取得了成功。

答案 5 :(得分: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();
    }

答案 6 :(得分:0)

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

答案 7 :(得分:-1)

我在我写的一个应用程序中遇到了类似的问题,问题结果是我试图向我们SerialPort.WriteLine发送\r\n以便在我真正需要时结束该行只需发送\n即可。当我切换到SerialPort.Write时附加了\n,一切都像HyperTerminal一样有效。

答案 8 :(得分:-1)

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