小弟這邊出現了一個問題想請教 因為設備韌體上有點問題,所以發生以下狀況..雖然韌體修正後已解決,但要找出為何會這樣的原因... 小弟使用c# 開啟程式會啟動下面這塊 SerialPort sp; public void Start(string COM_Port) { try { sp = new SerialPort(); sp.PortName = COM_Port; sp.BaudRate = 9600; sp.Parity = Parity.Even; ... ... ..... sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived); if(sp.Open==true) { sp.close(); } sp.open(); //程式關閉後再開啟這邊會出錯 } catch (Exception ex) { throw new Exception(ex.ToString()); } } 設備第一次連線是正常的,但是當我會送一個命令出去,當那個設備接收到命令後..因為韌體出錯,所以我會看到裝置管理員裡面自動重新整理一下,可是該裝置還是存在的(應該是說搞不好設備有瞬間斷電行為),此時我已經和設備處於斷線狀態 這時我將我的程式關閉(確定處理程序內已經沒有我的程式),再次打開...執行到sp.Open();的地方,會出現"通訊埠 'COM11' 不存在"的錯誤 但其實我很確定裝置管理員中的設備是存在的.....必須重新插拔才能正常運行 當該設備出錯時,我嚐試再送一個Polling命令,得到的錯誤是"System.IO.IOException: 連結到系統的某個裝置失去作用。" 甚至我要在發生這個Exception的地方,加入sp.Close();或是sp.Dispose(0; 他都會跳出"通訊埠 'COM11' 不存在"的錯誤 可是 當使用VB6 採用MSComm MSComm(i).PortOpen = False 反而沒問題,設備出錯後,程式關閉重新開啟也不會出現像是"通訊埠 'COM11' 不存在這種錯誤" 請問這可能是什麼問題
我已經構建了一個C應用程式,它從串列埠讀取和寫入資料。連線到串列埠的裝置是一個FTDI USB到序列轉換器,它通過XBEE無線模組與硬體通訊。硬體測試電池模組的容量和穩態電壓等。這些測試需要幾天時間才能完成。
在丟擲此錯誤後,將丟擲一個
這是初始化串列埠的方法
以及處理串列埠讀取的後臺工作程式
現在,我將重寫程式碼,以便從同一執行緒讀寫串列埠,以檢視這是否有任何區別。
希望通過停止後臺工作程式的serialport.read、關閉埠、重新開啟埠、再次執行後臺工作程式並再次嘗試寫入相同的命令,可以成功地從該錯誤中恢復。訊息框仍然會阻止程式碼,這樣我就可以看到錯誤發生的時間,並可以監視它是如何恢復的。
這是怎麼回事? 解決辦法根據我的經驗,10個執行緒中有9個在另一個執行緒(無論是否終止)沒有對硬體埠的獨佔訪問時發生這種情況。
這樣做比較好
因為這也將匯出異常中的堆疊跟蹤。 |