2008-11-12 100 views
4

我有一個來自u-blox.com的帶有USB連接和驅動程序的GPS。驅動程序會安裝一個虛擬的COM端口,當您插入USB時會彈出。使用超級終端,我可以觀看來自GPS的數據流。C#與u-blox gps的串行通信

然後我想要的數據在我的程序,不是那麼容易的......

我已經實現了用一個串口類從GPS讀一些方法,但我不成功。我之前在C#中編寫了幾個串行設備讀取器和編寫器,但是這個阻止了我。

作爲一個例子,simpleSerial中的簡單代碼將不會給你任何東西,除非你拔掉並重新插入USB。

已經嘗試用matlab讀取它,這很好用,但是因爲需要GPS數據的其餘程序在c#中,所以不能很好地解決問題。

是否有一些高級別的C#事情在serialPort類中進行,我可以繞過?或者是否有任何已知問題讀取USB串口,我假設它像我的GPS一樣?

回答

1

如果您可以使用超級終端與GPS進行通信,那麼原則上沒有理由不能使用C#。你確定你已經正確配置了串口,特別是波特率,數據位,停止位,奇偶校驗和流量控制設置嗎?

您可以使用SysInternals PortMon工具查看底層I/O,並比較超級終端和C#程序各自如何配置串行端口。也許這會提供一些有用的信息。

+0

波特率,數據位,停止位,奇偶校驗和流量控制已被四重檢查:),並且由於simpleSerial將讀取數據如果我拔下並重新插入GPS,這些設置應該正常運行。 – user36927 2008-11-13 07:18:44

1

我已經成功地將.Net 2中的SerialPort類用於虛擬comport上的gps。看起來你的虛擬comport驅動程序有點關閉。如果您找不到更新的驅動程序,我建議您調用WinAPI函數來讀取串行端口。

看看這個代碼,例如: http://www.codeproject.com/KB/system/SerialPortComm.aspx

+0

該示例在vC++中,但我會與http://msdn.microsoft.com/en-us/library/2d9wy99d.aspx一起嘗試使用WinAPI函數。 – user36927 2008-11-13 08:11:41

+0

一些代碼也在這裏: http://www.codeproject.com/KB/system/serial.aspx – 2008-11-27 15:09:54

-1

我遇到了類似的問題在應用程序中我寫的,問題竟然是,我是想給我們SerialPort.WriteLine它發送一個\r\n到結束時,我真的需要發送\n。當我切換到SerialPort.Write並在末尾附加了\n時,所有操作都與超級終端一樣。

0

不確定這是否與您遇到的問題相同。

我注意到,如果RX_FLAG與SetCommMask API一起使用,則GetOverlappedResult似乎不會在第一個WaitCommEvent之後返回。看起來,API正在等待某些事情發生,直到com掩碼被重置(至少這是我觀察到的)。但是,如果您在讀取端口之後仍然收到一些數據,則設備將不再響應。在這種情況下,您需要拔下並重新插入設備以使其再次響應。

但是,如果使用RX_CHAR,則GetOverLappedResult將返回正確的狀態,並且設備按照正常情況工作。

希望這些信息對您有所幫助。

0

問題是USB串口驅動程序或SerialPort類的Microsofts實現中存在一個錯誤。使用由Prolific製造的芯片(因此Prolific的驅動程序),USB與串行適配器的問題完全相同。

我還沒有能夠精確地縮小問題的範圍,但現在.NET Framework源代碼可用了,我將嘗試進入SerialPort並查看問題究竟在哪裏。

解決方法是使用不同的串行訪問類。在.Net 2.0之前,我編寫了一個SerialStream類,出於某種原因,它似乎可以正常使用這些相同的USB到串行適配器,而SerialPort類將不起作用。

您可以在http://www.6bit.com/download/SerialStream.zip搶我的班級我提供了這個相同的代碼一些GPS同胞多年來的程序員,他們也已經成功與它。

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(); 
    } 
0

得到具有U的Blox GPS同樣的問題,但設法通過使DTR和RTS性質來解決它。現在我可以閱讀NMEA句子了。我發現的一個問題是,我仍然需要不時地將我的GPS卸下並重新插入USB端口。 希望它有幫助。

1

從u-blox的支持得到了這個。

以下十六進制命令將強制GPS模塊上的看門狗復位。

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

此爲ARM7 UP在GPS 低電平命令它適用於所有的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); 

這對我的作品。

-1

嘗試使用握手/流量控制。它們在使用USB串行適配器時也很有用。