问题描述
在使用C#serialPort制作的串口调试器过程中发现的问题,希望能够描述清楚也希望有人能知道为什么会这样,假设使用C#串口调试助手打开COM1之后再关闭com1之后直接使用com1口为单片机写程序,这样问题就来了,只是能够正常打开串口但是却永远显示等待单片机响应,只有拔掉USB串口再重插或者使用网上下载的串口调试助手重新打开一次COM1在关闭才可以给单片机写入程序,不知道是什么问题,补充说明下如果不给单片机写程序的话只是使用串口测试收发那一切都正常,无论怎么打开关闭再打开都可以收发数据,个人水平有限不知道为什么只是感觉上是C#serialPort控件打开再关闭之后没有彻底释放资源还有占用,我能想到的关闭方法只有下面这些了试过关闭代码如下:serialPort1n.Close();serialPort1n.Dispose();GC.Collect();GC.WaitForPendingFinalizers();只是仍然是有问题,实际试了从网上下载的串口调试助手就没有我说的这个问题,下面是我打开串口的代码了:serialPort1n.Open();if(serialPort1n.IsOpen){}最后补充一句就是我想请教各位大神的问题就是C#serialPort打开后应该怎样关闭才能不出现我说的问题
解决方案
解决方案二:
不管底层有没有抛出事件(或者你根本没有捕获事件),你都可以从高层设计一个心跳机制,来真正检测所有你需要检测的状态。例如你可以每隔10秒钟轮询一次注册的所有设备,对于那些超时未响应的设备以后就不再做请求,如过所有设备都没有响应则可以关闭串口了。
解决方案三:
不要纠缠“怎样关闭”这类低级的技术问题。网络本来就是时断时通的,如果对方没有“关闭”而只是“死掉”了,你又如何处理?
解决方案四:
引用1楼以专业开发人员为伍的回复:
不管底层有没有抛出事件(或者你根本没有捕获事件),你都可以从高层设计一个心跳机制,来真正检测所有你需要检测的状态。例如你可以每隔10秒钟轮询一次注册的所有设备,对于那些超时未响应的设备以后就不再做请求,如过所有设备都没有响应则可以关闭串口了。
说的有点道理我只想解决实际问题又或者为什么会有问题很希望知道为什么缺又根本无思路这就是菜鸟的悲哀了
解决方案五:
不会吧,你简单写个程序试试,关闭了应该是释放资源了的
解决方案六:
其实,只要程序运行,serialport根本不需要关闭,也就是说spopen以后,直接把连接设备拔掉,再插上,直接就能通信你出现的情况,可能是因为写完程序之后,连接设备端的信号出现异常导致的你试试,不要关闭sp直接插拔设备,看看能不能继续通信
解决方案七:
看来还是我没说明白问题现象问题现象是假设使用我用c#制作的调试助手打开com1之后再关闭com1,之后在不拔出usb串口的情况下直接使用com1就会出现我说的问题说明下因为使用的是单片机开发版所以usb串口和单片机再同一块板子上,写完这个回复突然之间想到了一种可能性需要试试
解决方案八:
引用5楼龍过鸡年的回复:
其实,只要程序运行,serialport根本不需要关闭,也就是说spopen以后,直接把连接设备拔掉,再插上,直接就能通信你出现的情况,可能是因为写完程序之后,连接设备端的信号出现异常导致的你试试,不要关闭sp直接插拔设备,看看能不能继续通信
拔掉再插肯定好使了但是问题就是用网上下载的串口助手不拔也好使自制的必须拔掉或者使用网上下载的助手打开一次所以问题一定在程序上还是我未知的想不到的地方
解决方案九:
没遇到过,我只知道用.net的串口类打开串口然后直接拔下usb再插会很蛋疼
解决方案十:
引用7楼tys591320的回复:
Quote: 引用5楼龍过鸡年的回复:
其实,只要程序运行,serialport根本不需要关闭,也就是说spopen以后,直接把连接设备拔掉,再插上,直接就能通信你出现的情况,可能是因为写完程序之后,连接设备端的信号出现异常导致的你试试,不要关闭sp直接插拔设备,看看能不能继续通信拔掉再插肯定好使了但是问题就是用网上下载的串口助手不拔也好使自制的必须拔掉或者使用网上下载的助手打开一次所以问题一定在程序上还是我未知的想不到的地方
你的关闭方式是不是用的Close()如果是的话,你下次再打开,直接new一个,不要Open()
解决方案十一:
个人感觉,不像是关闭串口的问题。你的串口设备,是否是正常的?你说你只有在对设备进行处理后,才会导致串口的占用。那你就找你对设备处理时候的程序都做了什么?与设备的协议是否都正常?
解决方案十二:
C#的SerialPort的Close仅仅是关闭内部流。而且她不立即关闭端口的。文档上说需要等待一会儿再Open。