2014-03-14 16 views
0

這是我的第一個SO問題,請在沒有提供足夠或正確信息的地方糾正我。在調試過程中無法訪問串口

我通過FTDI串口上的RS232端口將兩個RFID標籤閱讀器連接到我的程序的USB集線器。該程序在VS2010外完美運行,但我無法調試代碼。該程序在調試過程中可以正常啓動,但只要我在讀取範圍內帶入標籤,就會出現錯誤。這隻發生在調試過程中。

錯誤:

Error Opening Serial Port COM9 

System.UnauthorizedAccessException: Access to the port 'COM9' is denied. 

    at System.IO.Ports.InternalResources.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 Tag_Reader.COMs.openPort(String sPortName) in C:\XXX\Tag_Reader\COMs.cs:line 36 

COMs.cs:第36行:

_port.PortName = sPortName; 
_port.BaudRate = 9600; 
_port.DataBits = 8; 
_port.Parity = Parity.None; 
_port.StopBits = StopBits.One; 
_port.ReadTimeout = 500; 
_port.WriteTimeout = 500; 
_port.Open(); 

我希望得到任何幫助!如上所述,如果我在VS外運行.exe,程序運行時不會出現小故障。

編輯: 此錯誤調試期間只發生僅當有從標籤(當標籤被讀寫器的讀取接近時)被流數據。這表明端口設置是正確的。

+0

你確定你的設備有可用的com9嗎? –

+0

確保COM9是連接到讀卡器的端口 –

+0

另請查看關於BaudRate的設備手冊。 –

回答

3

例外情況是很有具體的,它只是意味着一件事。端口已經打開,您不能再打開它。這可能是另一個過程,它可能是你自己的。

你可能會犯的一個標準錯誤,使得它特定於調試會話,就是使用另一個程序來查看由端口發送的數據。一個常見的事情,你想比較這個程序顯示的數據和你顯示的數據來尋找不匹配。這不能工作,你開始這樣一個程序之前,你開始自己的,它會打開端口,你的程序將永遠失敗。您需要一種不同的實用工具來完成此操作,它是一種在串口驅動程序之前自行注入並過濾驅動程序請求的過濾驅動程序。 SysInternals的PortMon就是一個例子。

Any only when there is data being streamed from the tag reader

這個評論是很麻煩的,必須的過程總是標籤讀取器開始流數據之前打開的端口以及。這提示了一種非常不同的錯誤,應該從完整的堆棧跟蹤中可見。 DataReceived事件處理程序中的代碼導致Open()方法再次被調用的一些場景。由於DataReceived事件處理程序中的Begin/Invoke()調用可能隱藏得很好。

最後但並非最不重要的一點,請確保您的從不反覆調用Close()和Open()。 Close()調用並不實際關閉串口,只有開始才能關閉它。內部工作線程需要退出,這需要時間。只有在程序終止時調用Close()。

+0

謝謝你的回覆!不幸的是,沒有其他程序使用該端口(這會讓事情變得更容易......)。然而,我做Open()en多次關閉()端口,我會看看並修復它。真正困擾我的是,這隻發生在VS的調試模式下... – monkeyman

+0

刪除多重打開()和關閉()工作就像一個魅力!謝謝! – monkeyman

0

你可以列出所有aviable相稱這一點:

List<string> portNames = SerialPort.GetPortNames().ToList(); 
       if (portNames.FirstOrDefault(p => p.ToLower() == "COM9".ToLower()) != null){ 
//Connect 

} 

時COM9是aviable你應該檢查你的參數進行連接,然後嘗試連接你的端口。

編輯: SerialPort.GetPortNames只顯示您的應用程序的可變端口。當任何其他應用程序阻止Com9,只會顯示其他的Comports

-1

您是否考慮過由於RFID協議處理導致的計時問題?
我會嘗試檢查到主機和返回的數據流類型。我知道在一些RFID協議中,時間(幾乎)是一切。