SOS,大神们请进,求助一个关于串口(USB转)的棘手问题

蛮牛他爹 2012-07-28 10:53:30
这段时间在写一个串口程序,主要用于和设备进行通信,实现对设备状态的监测和控制。

虽然软件编写是以串口的形式,但是设备是以USB形式连接到电脑的,USB接口一插接到电脑后,就映射成了一个COM口(也就是说在设备内部有个USB接口转串口的芯片,第一次连接电脑还要装驱动程序),所以写程序的时候完全不用管USB的事,使用串口的套路就行了。(本人电脑中已经有com1、com3口,所以映射成了com4口)

软件做得差不多了,监测和控制的功能也完全能实现,但是突然发现有这么个问题,搞了很久也没有搞定!!
问题是这样的:

由于设备是连接到电脑USB接口的,所以存在随时拔掉该设备的情况。如果软件正在运行的时候,突然拔掉该USB,软件失去和设备的联系,监测和控制功能丧失,软件也不会报错,一切正常。但是,如果关闭软件,软件就会报错,在VS2005下提示“对端口的访问被拒绝”,而且报错不会定位到程序的任何一个代码行(这个最头疼,问题出在哪儿都不好找),关闭该报错提示窗口,软件窗口被关闭,但是程序仍然处于运行中,必须手动点击VS2005中停止按钮,程序才最终得到终止。

为了解决这个问题,我在窗口的closing事件(窗口关闭前)过程中添加了serialport控件的close方法、给serialport控件的portname重新赋值为“com1”的方法、dispose释放serialport控件的方法,发现这些措施都不能避免软件报错,问题依旧。后来专门测试了下,在软件其他地方(不是窗口的closing过程中)使用完seriaport马上就进行关闭close,那么软件关闭不会报错。可问题是,这个软件运行的过程中随时要打开串口和设备进行通信,不可能关闭串口的,也就是说这个软件运行过程中,串口必须一直处于打开状态---关闭了就没法接受设备发送过来的信息了,就没法一直监控设备了。


我现在能想到的唯一方法就是添加一个timer控件,以较高的频率(比如说10ms)不断地对计算机可用串口进行检测,当发现USB接口映射到那个com口不存在的时候,我就对serialport控件进行关闭或者重新赋值为其他com口,或者dispose该serialport控件,这种方法应该能解决该问题(虽然我还没有试过),但是我觉得这样有点浪费资源(timer控件一直处于打开状态),而且感觉方法稍微有点“笨拙”,呵呵,所以特发贴来此求助高人们,给一个最好的解决办法,知道这里高人多,望高人们不吝赐教啊!!!


非常感谢了!!!
谢谢!
...全文
1379 59 打赏 收藏 转发到动态 举报
写回复
用AI写文章
59 条回复
切换为时间正序
请发表友善的回复…
发表回复
於黾 2014-11-04
  • 打赏
  • 举报
回复
引用 49 楼 pengwu666 的回复:
使用.net 4.0 应该不会有下面的问题 [quote=引用 48 楼 Z65443344 的回复:] 没什么办法,亲测,即使拔掉USB,IsOpend属性依然为true 这样在执行close的时候一定会出错
[/quote] 4.0修复了这个BUG? 测试过吗,不要靠猜想
pengwu666 2014-11-04
  • 打赏
  • 举报
回复
使用.net 4.0 应该不会有下面的问题
引用 48 楼 Z65443344 的回复:
没什么办法,亲测,即使拔掉USB,IsOpend属性依然为true 这样在执行close的时候一定会出错
於黾 2014-11-04
  • 打赏
  • 举报
回复
引用 58 楼 pengwu666 的回复:
[quote=引用 57 楼 Z65443344 的回复:] 或者你用的不是SerialPort,而是API?
我直接用的LZ的代码测试的。没有问题[/quote] 你串口是否没有收到数据? 如果有数据到达,就不一样了 仅仅是打开串口,直接拔掉USB,是没有问题的
pengwu666 2014-11-04
  • 打赏
  • 举报
回复
引用 57 楼 Z65443344 的回复:
或者你用的不是SerialPort,而是API?
我直接用的LZ的代码测试的。没有问题
於黾 2014-11-04
  • 打赏
  • 举报
回复
或者你用的不是SerialPort,而是API?
於黾 2014-11-04
  • 打赏
  • 举报
回复
引用 55 楼 pengwu666 的回复:
2.0 4.0 都会变false
不对吧,亲测,2.0下不会变false,依然是true
pengwu666 2014-11-04
  • 打赏
  • 举报
回复
2.0 4.0 都会变false
a465714551612 2014-11-04
  • 打赏
  • 举报
回复
捕获异常也不行么?其实我想说,这种情况是一种故障,不是bug,我现在用的串口调试助手之类的软件,在打开串口传输数据的时候突然拔掉设备,也回出现一些运行错误之类的提示
於黾 2014-11-04
  • 打赏
  • 举报
回复
引用 52 楼 pengwu666 的回复:
我下载了你的工程测试了,突然拔掉串口依然不会出错,在2.0测试也没有问题,我用的VS2010。 很多软件是因为用到了线程,或循环读取数据,拔掉串口才会一直提示错误,导致关闭都不行。 你的这个代码不会出现无法关闭的情况呀
我想知道,在4.0下,拔掉USB之后,IsOpend属性变成false了吗?
pengwu666 2014-11-04
  • 打赏
  • 举报
回复
我下载了你的工程测试了,突然拔掉串口依然不会出错,在2.0测试也没有问题,我用的VS2010。 很多软件是因为用到了线程,或循环读取数据,拔掉串口才会一直提示错误,导致关闭都不行。 你的这个代码不会出现无法关闭的情况呀
pengwu666 2014-11-04
  • 打赏
  • 举报
回复
引用 50 楼 Z65443344 的回复:
[quote=引用 49 楼 pengwu666 的回复:] 使用.net 4.0 应该不会有下面的问题 [quote=引用 48 楼 Z65443344 的回复:] 没什么办法,亲测,即使拔掉USB,IsOpend属性依然为true 这样在执行close的时候一定会出错
[/quote] 4.0修复了这个BUG? 测试过吗,不要靠猜想[/quote] 我用的4.0按你说的我测试过没有这个问题。但是没有用低版本测试。
於黾 2014-10-30
  • 打赏
  • 举报
回复
没什么办法,亲测,即使拔掉USB,IsOpend属性依然为true 这样在执行close的时候一定会出错
keetian 2014-10-30
  • 打赏
  • 举报
回复
解决方法: https://connect.microsoft.com/VisualStudio/feedback/details/140018/serialport-crashes-after-disconnect-of-usb-com-port
低姿态微笑 2014-10-24
  • 打赏
  • 举报
回复
木有检测设备状态的接口吗 用个线程监控设备状态
田垛里 2014-10-24
  • 打赏
  • 举报
回复
这问题解决了吗
  • 打赏
  • 举报
回复
这个问题的根源就是出在微软,因为打开一个串口,相当于打开一个文件,在微软认为,打开的文件是无法被删除的。但是,出现了USB转串口之后,这个问题就出现了,即使打开一个串口,仍然可以强制拔掉USB线,这样,打开的文件就不存在了,那么就会出现楼主的问题,暂时没有想到解决办法
leafmao 2013-08-26
  • 打赏
  • 举报
回复
"如果软件正在运行的时候,突然拔掉该USB,软件失去和设备的联系,监测和控制功能丧失,软件也不会报错,一切正常。但是,如果关闭软件,软件就会报错,在VS2005下提示“对端口的访问被拒绝”,而且报错不会定位到程序的任何一个代码行(这个最头疼,问题出在哪儿都不好找)" ================== 拔掉USB不会出错是因为串口没有数据,不会触发DataReceived事件,此过程中没有对端口进行操作。 但是关闭窗体的时候,是要释放串口资源的,于是就出错了。 没想到什么好的办法,试试在关闭窗口的时候直接退出程序“Environment.Exit(0);"
lovetsfuer 2013-08-26
  • 打赏
  • 举报
回复
这个问题不好整,你看看串口调试助手,都是拔掉串口后程序出错连结束都不让点。 我们经常用串口一样的毛病,串口故障了,软件反应的是数据没获得。 你去用软件解决这个问题,为什么不保持你的串口不变动呢?USB转串口我们都是笔记本临时调试用,就这还有时候会罢工呢,不用说用到成品软件上了。
Lycanthia 2013-08-26
  • 打赏
  • 举报
回复
我写的也一直存在相似问题,若串口处于打开状态时直接拨掉后,再重新插入串口就不能用了,除非把软件关闭再打开才可以。很是郁闷,这问题缠了我一年多了。 无奈好像用serialport组件的人太少了!
蛮牛他爹 2013-04-16
  • 打赏
  • 举报
回复
引用 39 楼 juanjuan526502 的回复:
楼主,你好,你的问题解决了么?我现在也遇到相同的问题,很是棘手啊,大家有没有好办法,顶起来啊
没有彻底解决,呵呵,头疼
加载更多回复(37)

110,545

社区成员

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

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

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