串列埠是最常見和入門的通訊手段,在此記錄串列埠使用過程中接觸到的 知識點 問題 以及可能的解決方法
c# 操作串列埠類 serialport使用自查說明文件
工程型別:wpf
分析:具體原因分析不出,因為工程較複雜,執行緒較多,debug情況下無法再現,所以不好排查原因。初步分析是在串列埠關閉之後,引起一些關聯執行緒異常,但debug情況下沒有收到任何異常提醒,原因不明。
解決:因為除錯的角度沒有問題,只能從其他角度解決這個問題。根本原因在使用過程中插拔裝置導致,所以我在mainwindow.cs下作了插拔檢測,用捕捉windows訊息的方式。裝置插拔會有windows訊息傳出,我捕捉到之後直接執行關閉串列埠與開啟串列埠操作。
private void window_loaded(object sender, routedeventargs e)
public const int wm_devicechange = 0x219;
//裝置插拔改變函式
private intptr deveicechanged(intptr hwnd, int msg, intptr wparam, intptr lparam, ref bool handled)
}if (isremove)
else
}return intptr.zero;
}
下鉤子捕捉devicechange,我執行一次插拔,會捕捉到三條wm_devicechange訊息,不明原因,但閃退現象沒有再出現。
分析:我的串列埠接收是serialport的datarecieved事件。自定的上下位機傳輸協議的長度確定。
我在接受事件裡的操作是串列埠快取區資料個數大於包數就全取出來做資料匹配,正常情況下收到的都是幾個整包。
出先斷包的現象,初步懷疑是usb驅動的問題。主要現象是 第一次接收到 乙個完整的包+下個包的前部分 下次收到餘下部分的資料。 所以如果我取出來的資料裡有不完整部分,會被捨棄,導致資料丟失。於是我每次只從快取區取包長的整數倍的長度的資料出來,斷幀部分存著等它的下半部分來了一起取。
事實上這樣的操作確實解決了資料的大部分丟失問題,但是當串列埠不再有資料進來時,通知事件一直沒有被觸發,此時留在串列埠接收快取區的剩餘內容就一直無法取出來。
目前分析看來,串列埠的接收事件觸發要滿足兩點:1.串列埠接收時鐘 2.有資料進入。
我執行到最後只有時鐘沒有資料進入 此時我留存在快取區里的資料就一直無法被取出。
解決:最後我也沒找到serialport類裡有什麼介面或屬性與這問題有關,所以採取了最笨的方法,直接拋棄串列埠接收事件,不採用觸發的形式,而是用乙個接收執行緒去迴圈查詢快取區內容。執行緒比較耗時,死迴圈內有加1毫秒sleep阻塞。目前沒有出什麼大問題。丟資料的情況也沒有再發生。只是對無端被占去的時間片資源有些耿耿於懷。公司沒這方面的經驗者,純摸著石頭做專案,所以如果有大神能指點下 感激不盡。
自動化部署工具
1.puppet puppet是開源的基於ruby的系統配置管理工具,基於c s的部署架構。是乙個為實現資料中心自動化管理而設計的配置管理軟體,它使用跨平台語言規範,管理配置檔案 使用者 軟體包 系統服務等。客戶端預設每隔半小時會和伺服器通訊一次,確認是否有更新。當然也可以配置主動觸發來強制客戶端更...
自動化運維工具 ansible系列命令
列出所有已安裝的galaxy ansible galaxy list 安裝galaxy ansible galaxy install geerlingguy.redis 刪除galaxy 推送命令至遠端,效率無線提公升,對運維要求較高管理加密解密yml檔案ansible vault create d...
自動化運維工具之fabric
fabric fabric是乙個基於python 2.5 2.7 的庫和命令列工具,用來提高基於ssh的應用部署和系統管理效率。稍微了解python的人都知道,實際上它只節省了數行 ifname main 這樣的慣例 而已。fabric 的設計目的更是為了使用它自己的 api,包括執行 shell ...