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控件一直处于打开状态),而且感觉方法稍微有点“笨拙”,呵呵,所以特发贴来此求助高人们,给一个最好的解决办法,知道这里高人多,望高人们不吝赐教啊!!!
非常感谢了!!!
谢谢!