VB.NET中,串口接收数大量数据时如果执行SerialPort.close动作,程序会卡死在这里

VB.NET中,串口接收数大量数据时如果执行SerialPort.close动作,程序会卡死在这里,具体症状为,在VS2010编译器中,程序停止在SerialPort.Close行,不再向下执行,且不抛出任何异常,点击程序暂停时显示执行至SerialPort.close行。用编译好的程序执行时,接收大量数据时关闭串口程序会宕死,任务管理器中显示程序为“正在运行”而非“未响应”,请问这种问题该如何处理。

对同一个串口的操作应该放在单个线程里,你的程序应该将串口接收和串口关闭的执行都放在一个线程里进行,这样在接收数据的间隙就可以正常执行close动作。而不会造成两个线程都在操作串口。追问

说起来,串口控件放在窗体上,应该不用特殊的线程操作,况且我并没有关闭线程安全检查,如果有问题恐怕编译都不能通过。而且不能关闭串口只有在串口有数据接收时出现,平时时候是可以正常关闭串口的。

追答

串口控件虽然在窗体上,但串口的打开、数据接收和串口的关闭都是你的代码主动加的动作,
并不是拖了一个控件,串口就自己打开了,所以你可以尝试一下,不要把串口的打开、数据接收、关闭都被用户按键响应之类的线程控制,要主动做一个单纯响应串口动作的线程,在用户点击打开串口或关闭串口按钮后,向这个串口动作线程发送请求,由这个线程来完成动作。

一般的项目程序,在串口操作设计上,会设计两个线程,一个线程用来发送数据,一个线程用来接收数据,这两个线程在程序启动时并不存在,而是在某个时机成功打开串口后才启动,而当其他线程想要关闭串口的时候,就必须先终止上面这两个线程,在这两个线程完全正常停止运行后才执行close动作,如果再次打开串口再重新启动上面两个线程。

你现在想办法让程序的读串口和关闭串口的操作不要同时间发生,验证一下这么做是否就不会卡死了。

追问

串口接收是放在控件的DataRecive事件中的,你说的收发都在独立线程我不太明白什么意思。

追答

针对你现在的处境,你应该是在某按钮的click事件中close串口,在串口控件的DataReceive事件中接收数据,你改成:
1)在串口控件的DataReceive事件响应开始时设置一个变量a为1,代表正在接收数据中,在事件响应走完的地方将这个变量a清为0,代表数据接收完毕。
2)在按钮的click事件响应时,设置一个变量b为1,代表串口请求关闭,
然后判断一下变量a是否为1,如果不是1的话,就执行串口close动作,否则就什么都不做。
3)在串口控件的DataReceive事件中将a清为0之后,判断一下变量b是否为1,
如果为1,就执行串口close动作。

追问

逻辑有点复杂,但是我知道什么意思了,谢谢。

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答