随笔 - 435  文章 - 0  评论 - 111  阅读 - 62万 

serialport DataReceived事件, 默认是收到一个byte就触发事件.

复制代码
            lock (thisLock)
            {
                int len = sp.BytesToRead;
                if (len > 0)
                {
                    Byte[] data = new Byte[len];
                    try
                    {
                        sp.Read(data, 0, len);
                    }
                    catch (System.Exception)
                    {

                    }
                    SerialPortEventArgs args = new SerialPortEventArgs();
                    args.receivedBytes = data;
                    Debug.WriteLine("**** port1_DataReceived=" + Encoding.Default.GetString(data));
                    if (comReceiveDataEvent != null)
                    {
                        comReceiveDataEvent.Invoke(this, args);
                    }
                }

            }
复制代码

举个例子,实际上返回的数据是*IDN?, 但每次触发的次数都不一样

复制代码
**** port1_DataReceived=*
**** port1_DataReceived=IDN?

**** port1_DataReceived=*
**** port1_DataReceived=I
**** port1_DataReceived=DN?

**** port1_DataReceived=*
**** port1_DataReceived=I
**** port1_DataReceived=D
**** port1_DataReceived=N?

**** port1_DataReceived=*
**** port1_DataReceived=I
**** port1_DataReceived=D
**** port1_DataReceived=N
**** port1_DataReceived=?

**** port1_DataReceived=*
**** port1_DataReceived=IDN
**** port1_DataReceived=?

**** port1_DataReceived=*
**** port1_DataReceived=I
**** port1_DataReceived=DN?
复制代码

 DataReceived 事件的处理,本质上是用线程来处理接收数据.

SerialPort类,请勿定义为局部变量, 因为局部变量在函数结束后就释放了.而线程还没结束,端口还没释放. 就会产生下面2种异常

System.ObjectDisposedException was unhandled
Message: An unhandled exception of type 'System.ObjectDisposedException' occurred in mscorlib.dll
Additional 

information: 已关闭 Safe handle

或者

System.UnauthorizedAccessException was unhandled
  HResult=-2147024891
  Message=对端口“COM5”的访问被拒绝。

 

posted on   Gu  阅读(1853)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
历史上的今天:
2007-02-06 在DedeCms下快速生成Google Sitemap的方法
点击右上角即可分享
微信分享提示