C# 串口通訊之艱難排錯之路 —— system.ObjectDisposedException已關閉 Safe handle

今天寫了一個串口通訊掃碼槍驅動,程序運行后,不出意外的全線崩潰,開始了漫長的排查之旅,具體情況報錯如下:

解決未處理 System.ObjectDisposedException
Message=已關閉 Safe handle
Source=mscorlib
ObjectName=""
StackTrace:
在 System.Runtime.InteropServices.SafeHandle.DangerousAddRef(Boolean& success)
在 System.StubHelpers.StubHelpers.SafeHandleAddRef(SafeHandle pHandle, Boolean& success)
在 Microsoft.Win32.UnsafeNativeMethods.GetOverlappedResult(SafeFileHandle hFile, NativeOverlapped* lpOverlapped, Int32& lpNumberOfBytesTransferred, Boolean bWait)
在 System.IO.Ports.SerialStream.EventLoopRunner.WaitForCommEvent()
在 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
在 System.Threading.ThreadHelper.ThreadStart()

真的真的很無語,程序正常跑了一會,也能捉到數據,突然它就中風了,數據捉不到了,也沒有任何報錯。

逼不得已程序重新解包重裝,到處打斷點一步一步調試。最后發現當這個BUG出現時,程序直接崩潰,無法跟蹤到錯誤代碼位置。

最后意識到SerialPort類引起的問題,可能是在已釋放的SerialPort對象上嘗試進行操作導致的問題。

  1. 思路一:
  • 為了解決這個問題,可以在使用完SerialPort對象后,確保正確地釋放和關閉它。
  • 但是呀,我的是掃碼槍啊,串口必須一直打開,怎么可能關閉它,于是這個方案立馬放棄。
  1. 思路二:
  • 我在使用SerialPort的時候可以檢查它的狀態呀確保在處理數據之前,串口仍然處于打開狀態。這樣可以避免在已關閉的串口上進行操作,從而減少System.ObjectDisposedException異常的發生。
  • 說干就干,代碼增加一行 if 判斷:
if (!serialPort.IsOpen){serialPort.Open();}
  1. 思路三:
  • 在一個函數內利用SerialPort創建了串口通信實例后,沒有將該實例放入任何其他容器中進行緩存,從而也會導致了上述崩潰BUG的產生。
  • 那我就修改代碼:將該實例放入了一個全局變量List<通信客戶端>集合,下面的代碼分別放到對應位置就行。
//這個作為全局變量就聲明創建
public List<SerialPort> PortModels = new List<SerialPort>();//這個在實例化對象后封裝
PortModels.Add(SerialPort);/

哈哈哈,經過以上幾步該BUG終于得以解決,家人們高歌萬歲吧!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/15112.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15112.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15112.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【pyspark速成專家】4_Spark之RDD編程2

目錄 四&#xff0c;常用PairRDD的轉換操作 五&#xff0c;緩存操作 四&#xff0c;常用PairRDD的轉換操作 PairRDD指的是數據為長度為2的tuple類似(k,v)結構的數據類型的RDD,其每個數據的第一個元素被當做key&#xff0c;第二個元素被當做value. reduceByKey #reduceByKey…

層次式架構設計理論與實踐

層次式體系結構概述 軟件體系結構為軟件系統提供了結構、行為和屬性的高級抽象&#xff0c;由構成系統的元素描述這些元素的相互作用、指導元素集成的模式以及這些模式的約束組成。 層次式體系結構的每一層最多只影響兩層&#xff0c;同時只要給相鄰層提供相同的接口&#xff…

禁用win10自動更新

services.msc——Windows Update——常規——啟動類型——禁用 services.msc——Windows Update——恢復——三個無操作&#xff0c;9999天。 gpedit.msc——計算機配置——管理模板——Windows組件——Windows更新——配置自動更新——已啟用——2-通知下載和自動更新 Windows…

如何參與github開源項目并提交PR

&#x1f47d;System.out.println(“&#x1f44b;&#x1f3fc;嗨&#xff0c;大家好&#xff0c;我是代碼不會敲的小符&#xff0c;目前工作于上海某電商服務公司…”); &#x1f4da;System.out.println(“&#x1f388;如果文章中有錯誤的地方&#xff0c;懇請大家指正&…

高速公路定向廣播(聲光一體) HT-600D

1、產品概述&#xff1a; HT-600D聲光一體平面波IP定向廣播是北京恒星科通創新性研發產品&#xff0c;采用公司自主研發的平面波傳聲技術&#xff0c;該產品具有高聲壓、強指向性、高清晰度等特點&#xff0c;采用定向聲傳聲技術將聲音聚集到正前方定向傳輸,周邊聲壓級明顯降低…

BTC系列-系統學習銘文(二)-序數理論

Ordinals的BIP: https://github.com/ordinals/ord/blob/master/bip.mediawiki 序數理論概述 序數是一種比特幣的編號方案&#xff0c;允許跟蹤和轉移單個聰。這些數字被稱作序號。比特幣是按照它們被挖掘的順序編號的&#xff0c;并從交易輸入轉移到交易輸出&#xff08;遵循先…

面試題:對已經關閉的channel進行讀寫

在Go語言中對已經關閉的channel進行讀寫&#xff0c;結果會有所不同。 讀操作 我們可以安全地從一個已經關閉的channel中進行讀取數據。如果channel中還有未讀取的數據&#xff0c;讀操作將成功并返回數據以及一個用于表示數據是否有效的標記(如果channel已經關閉并且該數據有…

YOLOV10實時端到端目標檢測

代碼地址&#xff1a;GitHub - THU-MIG/yolov10: YOLOv10: Real-Time End-to-End Object Detection 論文地址&#xff1a;https://arxiv.org/pdf/2405.14458 本文介紹了YOLO系列目標檢測器在實時和高效方面的優勢&#xff0c;但是仍然存在一些缺陷&#xff0c;包括依賴非極大值…

[240525] VMware Pro 個人可免費使用 | 人機交互角度 解釋 AI 同事出錯雖多但深得青睞之奧義

目錄 VMware Workstation Pro 個人可免費使用人機交互研究 ChatGPT 52%回答失實&#xff0c;78%邏輯不一致然卻備受青睞之奧義 VMware Workstation Pro 個人可免費使用 VMware 宣布 Fusion Pro&#xff08;Mac&#xff09;和 Workstation Pro&#xff08;Windows 和 Linux&…

純度高的安卓和混血安卓

安卓陣營純安卓和改裝安卓&#xff0c;純安卓好用&#xff0c;權限控制力度做到很小&#xff0c;每相權限都交用戶控制&#xff0c;權限控制層面可以精確到文件夾和文件&#xff0c;剪切板讀和寫&#xff0c;而且有精確權限追蹤功能&#xff0c;國產高度定制安卓系統只有粗糙訪…

React useState修改對象

在 React 中&#xff0c;useState 是一個 Hook&#xff0c;它可以讓函數組件擁有狀態。當想要改變一個對象類型的狀態時&#xff0c;我們需要使用展開運算符&#xff08;...&#xff09;或者 Object.assign 來確保狀態是正確地更新。 以下是一個使用 useState 來更新對象的例子…

webstorm新建vue項目相關問題

前言 這個迭代后端需求偏少&#xff0c;前端code的鍵盤都起火星子了。來了4個外包支持&#xff0c;1個后端3個前端&#xff0c;還是不夠用啊。剛好趁這個機會稍微學習下vue&#xff0c;其實之前環境也配置過了&#xff0c;所以這里就不分享環境配置了&#xff0c;主要分享下新建…

基于單片機電梯控制系統設計與實現

摘 要: 介紹了電梯控制系統架構 &#xff0c; 指出了該系統的硬件設計和控制系統的軟件設計以及系統調試 &#xff0c; 使系統可根據按鍵 要求完成載客任務&#xff0c;為電梯控制系統的優化提供了參考 。 關鍵詞 : 電梯控制 ; 單片機 ; 系統設計 0 引言 在高層建筑中發揮…

Java開發大廠面試第22講:Redis 是如何保證系統高可用的?它的實現方式有哪些?

高可用是通過設計&#xff0c;減少系統不能提供服務的時間&#xff0c;是分布式系統的基礎也是保障系統可靠性的重要手段。而 Redis 作為一款普及率最高的內存型中間件&#xff0c;它的高可用技術也非常的成熟。 我們今天分享的面試題是&#xff0c;Redis 是如何保證系統高可用…

GPT-4o之多模態

前言 想必&#xff0c;很多小伙伴都知道GPT-4o已經發布了&#xff0c;一手基于多模態的問答顯示&#xff0c;看起來挺厲害的&#xff08;也就是看起來&#xff0c; &#xff09;。然后&#xff0c;我就順手看了看什么是多模態。 簡介 多模態&#xff08;Multimodal&#xff…

什么是組態?什么是工業控制中的組態軟件?

隨著工業4.0和智能制造的發展&#xff0c;工控軟件的應用越來越廣泛&#xff0c;它們在提高生產效率、降低能耗和減少人力成本等方面發揮著越來越重要的作用。 什么是工控軟件&#xff1f; 工控軟件是指用于工業控制系統的軟件&#xff0c;主要應用于各種生產過程控制、自動化…

標準庫算法

歡迎訪問我的博客首頁。 標準庫算法 1. 查找對象的算法2. 其它只讀算法3. 二分搜索算法4. 寫容器元素的算法5. 劃分與排序算法6. 通用重排操作7. 排列算法8. 有序序 列的 集合算法9. 最 小值和 最大值10. 數值算法11. 參考 Pred 表示返回值為布爾類型的可調用對象。 1. 查找對…

Python序列的概念與使用-課后作業[python123題庫]

序列的概念與使用-課后作業 一、單項選擇題 1、關于Python組合數據類型&#xff0c;以下描述錯誤的是&#xff1a;??????????????????????????????????????????????????????????????????????????…

Flutter 中的 DecoratedBox 小部件:全面指南

Flutter 中的 DecoratedBox 小部件&#xff1a;全面指南 在Flutter中&#xff0c;DecoratedBox是一個功能豐富的小部件&#xff0c;它為子組件提供了多種裝飾效果&#xff0c;如背景色、邊框和陰影。通過DecoratedBox&#xff0c;你可以輕松地為任何小部件添加裝飾&#xff0c…

PLSQL連接Linux Oracle21c

PLSQL連接Linux Oracle21c 一、安裝PLsql 下載官網 https://www.allroundautomations.com/registered-plsqldev/ 二、Oracle Instant Client下載 使用plsql連接oracle的時候是需要本地先安裝oracle客戶端&#xff0c;英文名就是Oracle Instant Client。 官方下載地址&…