2010-11-25 197 views
2

我正在嘗試爲GPS設備編寫自定義應用程序,而且我需要讀取GPS數據。Windows CE和串行端口問題(無法打開端口)

我面臨的問題是我無法打開GPS端口。我知道它是哪個COM,而且我知道波特率,但每當我採用Open()方法時,我都會得到一個IOException

port = new SerialPort("COM6", 9600); 
port.ErrorReceived += new SerialErrorReceivedEventHandler(port_ErrorReceived); 
port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); 
try 
{ 
    port.Open(); 
} 
catch (IOException ex) 
{ 
    SetLabel(label1, ex.Message); 
} 

堆棧跟蹤:

at System.IO.Ports.SerialStream.WinIOError(Int32 errorCode, String str) 
at System.IO.Ports.SerialStream..ctor(String portName, Int32 baudRate, Parity parity, Int32 dataBits, StopBits stopBits, Int32 readTimeout, Int32 writeTimeout, Handshake handshake, Boolean dtrEnable, Boolean rtsEnable, Boolean discardNull, Byte parityReplace) 
at System.IO.Ports.SerialPort.Open() 
at PortTest.Form1.button1_Click(Object sender, EventArgs e) 
at System.Windows.Forms.Control.OnClick(EventArgs e) 
at System.Windows.Forms.Button.OnClick(EventArgs e) 
at System.Windows.Forms.ButtonBase.WnProc(WM wm, Int32 wParam, Int32 lParam) 
at System.Windows.Forms.Control._InternalWnProc(WM wm, Int32 wParam, Int32 lParam) 
at Microsoft.AGL.Forms.EVL.EnterMainLoop(IntPtr hwnMain) 
at System.Windows.Forms.Application.Run(Form fm) 
at PortTest.Program.Main() 

什麼使事情非常令人氣憤的是,我發現了一個樣本本地C++代碼沒有工作,沒有問題打開的端口,我連看一眼一些NMEA字符串。但是,這一切都是使用Web提供的示例C++代碼完成的,並且我不覺得足夠精通以我的整個應用程序爲基礎。我想堅持使用C#。

是否有任何其他方式在Windows CE中使用SerialPort類在C#中打開端口?或者也許完全使用其他類?
如果沒有,是否有可能允許Windows CE提供相同(或類似)功能的C++寫入DLL?

編輯(更多詳情): 我得到的例外就是這樣。 IOException異常。 Visual Studio調試器告訴我沒有更多。我不知道這是否是由於設備上一些粗糙的Windows CE設置造成的。我記得我的Windows Mobile設備上的異常字符串有問題,但是通過添加對System.SR的引用解決了這個問題,我已經在這種情況下嘗試過。如果我錯過了一些關於Windows CE和異常消息的技巧,我也很想知道。 ;)

我也嘗試使用沒有事件的代碼,並通過在構造函數中指定更多參數,並且在嘗試打開端口時總是會遇到異常。

最後,我已經嘗試添加一個到端口名稱,這也沒有幫助。

+0

不要在標題中使用標籤。並檢查拼寫。請。乾杯:) – abatishchev 2010-11-26 08:11:49

回答

0

沒有建議的解決方案工作。這一部分仍然「無法開啓」。我們通過一個C++編寫的本地DLL來解決這個問題,該DLL會打開端口並從中讀取數據。

這個解決方案並不理想,但它是我們設法實現的最好的解決方案。

這是一個相當「長」的解決方案,並且表明Compact Framework在這種特殊情況下出現了問題。

1

我建議爲構造函數提供更多選項;奇偶校驗,停止位和握手模式。

SerialPort port = new SerialPort ("COM6", 9600, Parity.None, 8, StopBits.One); 
port.Handshake = Handshake.None; 
0

目前我不太清楚,但通過使用本機的Win32 API,你必須通過名稱COM6:不僅COM6調用設備。但是我不知道C#SerialPort類在這一點上的表現如何。

此外,我不認爲這是一個使用參數的問題,因爲他們會遲來玩。所以我的第二個猜測是,您添加的活動訂閱可能會導致問題。所以只是要絕對確定我會評論你訂閱ErrorReceivedDataReceived的兩條線。

我也有一次也是一個相當離奇的失敗。回想起來,似乎我以這種方式寫了端口名稱是錯誤的,即這些字符不是我的代碼文件中用於聲明端口名稱的默認ANSI字符。所以在刪除和重寫構造函數之後,問題突然消失了。

最後但並非最不重要的是,您在代碼中顯示StackTrace拋出了WinIOError。但是,你可能會更新你的問題,並告訴我們確切的錯誤代碼或錯誤信息?

0

在CE端口名稱必須以一個冒號作爲後綴,所以CHANE到 「COM6:」

0

不正確的冒號是必需的[在Windows CE 6.0R3 Compact Framework的3.5]。對於n> 9的COM端口,我只用「COMn」或「$ device \ COMn」打開我的串口。但看起來Compact Framework V1需要OpenNetCf版本才需要冒號。

我建議調用靜態方法SerialPort.GetPortNames()並確保硬編碼爲COM6的設備實際上在返回的字符串數組中可用。

1

我有同樣的問題,重新安裝System_SR_ENU.cab和NETCFv2。事後工作沒有問題。

1

我有一個類似的問題,下面的代碼工作在我的情況。爲了正確初始化,我必須至少從另一個應用程序訪問串行端口一次。我試圖打開串口作爲普通文件(注意,我使用「COM8:」而不是「COM8」作爲文件)。

//The settings object is defined elsewhere... 
settings.PortName = "COM8"; 

//Creates the serial port. 
SerialPort port = new SerialPort(); 
port.PortName = settings.PortName; 
port.BaudRate = settings.BaudRate;   
port.Parity = settings.Parity; 
port.DataBits = settings.DataBits; 
port.StopBits = settings.StopBits; 
port.ReadTimeout = 10000; 
port.DtrEnable = true; 
port.RtsEnable = true; 


string vComm = settings.PortName + ":"; 
FileStream stream = null; 
try 
{ 
    stream = new FileStream(vComm, FileMode.Open, FileAccess.Read); 
} 
catch 
{ 
    //pass  
} 
port.Open(); 
if(stream != null) 
    stream.Dispose();