c#wpf serialport类打开串口后强制拔出产生的问题

sa insist 2019-06-17 10:51:55
做小项目时遇到的问题,用serialport类打开串口,强制拔出设备后,serialport.IsOpen判断为false,但是当前串口依旧是被占用的,再次使用就会出现问题,有什么办法可以释放这个串口资源吗?
...全文
704 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sa insist 2019-06-17
  • 打赏
  • 举报
回复
引用 5 楼 wanghui0380 的回复:
[quote=引用 4 楼 sa insist 的回复:] 那请问我想在串口实例为false的状态下关闭对应的串口该如何写呢?
还是没get到核心,很明显你有多余一个的串口实例,所以别问我怎么关闭。你要关闭请找到前面那一个,然后把他关闭 所以我前面说了,最好你永远只用一个,这个就不涉及到“怎么查到前面那个并关闭”的问题[/quote] 可能我没有说清楚,我只定义了一个串口实例,打开串口后用定时器检测是否在打开期间出现serialport.IsOpen为false的事件发生,如果检测到了就正常关闭对应的串口。可能问题有点小白,初学几天,见谅
wanghui0380 2019-06-17
  • 打赏
  • 举报
回复
引用 4 楼 sa insist 的回复:
那请问我想在串口实例为false的状态下关闭对应的串口该如何写呢?
还是没get到核心,很明显你有多余一个的串口实例,所以别问我怎么关闭。你要关闭请找到前面那一个,然后把他关闭 所以我前面说了,最好你永远只用一个,这个就不涉及到“怎么查到前面那个并关闭”的问题
sa insist 2019-06-17
  • 打赏
  • 举报
回复
那请问我想在串口实例为false的状态下关闭对应的串口该如何写呢?
wanghui0380 2019-06-17
  • 打赏
  • 举报
回复
至于serialport.IsOpen 为false 其实不代表串口状态,他代表这个串口实例的状态。所以假设你第二次重新new了一个串口实例,并且你没open,那么他为false 所以,正常情况就像上面的说的,对于一个程序来说,对同一串口我们只建议使用一个串口实例进行操作 比较简略的写法是 static readeronly lazy<serialport> 一个静态只读的lazy对象
wanghui0380 2019-06-17
  • 打赏
  • 举报
回复
串口不是你想的那样,无论你有没有挂接设备,只要那个口存在,你就可以open,而且这个open是独占的 解决方案有两种 1.使用全局互斥体,只允许开一个,永远只用一个 2.使用CDHolding属性,检查设备是否处于“上线”状态。当前其实正常情况,我们都无需检查,因为就是对方不在线,你一样可以操作串口,所以你只保证他open就好
sa insist 2019-06-17
  • 打赏
  • 举报
回复
顶一下
sa insist 2019-06-17
  • 打赏
  • 举报
回复
引用 10 楼 wid999 的回复:
两个人都在自说自话。 wanghui0380的意思是串口打开,不管有没有连线,反正就用那个实例; 贴主的意思是串口关闭的状态下,要怎么对串口进行操作。 MSDN里面的一句: 备注 IsOpen 属性跟踪端口是否已打开以供调用方使用,而不是跟踪端口是否已由计算机上的任何应用程序打开。 意思就是说,串口线被强行拨出的话,你什么都没法做,只能报警。
谢谢,困惑了好久了
wid999 2019-06-17
  • 打赏
  • 举报
回复
两个人都在自说自话。
wanghui0380的意思是串口打开,不管有没有连线,反正就用那个实例;
贴主的意思是串口关闭的状态下,要怎么对串口进行操作。

MSDN里面的一句:
备注
IsOpen 属性跟踪端口是否已打开以供调用方使用,而不是跟踪端口是否已由计算机上的任何应用程序打开。

意思就是说,串口线被强行拨出的话,你什么都没法做,只能报警。

sa insist 2019-06-17
  • 打赏
  • 举报
回复
这篇帖子的问题与我的相似,如果觉得我描述的不清楚可以看下https://bbs.csdn.net/topics/390678166?list=28685648
sa insist 2019-06-17
  • 打赏
  • 举报
回复
引用 7 楼 wanghui0380 的回复:
我大概能明白你口中的“只定义了一个串口实例”的概念了 是这样么 class A { 串口 串口1=new 串口(); } 是,他就一个。但是你考虑一下 你又重新new 了个A,这个串口1是几个??
我就是在写这个classA类,所以不会出现newA的操作...
wanghui0380 2019-06-17
  • 打赏
  • 举报
回复
我大概能明白你口中的“只定义了一个串口实例”的概念了 是这样么 class A { 串口 串口1=new 串口(); } 是,他就一个。但是你考虑一下 你又重新new 了个A,这个串口1是几个??

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧