VB.NET中,串口接收数大量数据时如果执行SerialPort.close动作,程序会卡死在这里
VB.NET中,串口接收数大量数据时如果执行SerialPort.close动作,程序会卡死在这里,具体症状为,在VS2010编译器中,程序停止在SerialPort.C...
VB.NET中,串口接收数大量数据时如果执行SerialPort.close动作,程序会卡死在这里,具体症状为,在VS2010编译器中,程序停止在SerialPort.Close行,不再向下执行,且不抛出任何异常,点击程序暂停时显示执行至SerialPort.close行。用编译好的程序执行时,接收大量数据时关闭串口程序会宕死,任务管理器中显示程序为“正在运行”而非“未响应”,请问这种问题该如何处理。
展开
1个回答
展开全部
对同一个串口的操作应该放在单个线程里,你的程序应该将串口接收和串口关闭的执行都放在一个线程里进行,这样在接收数据的间隙就可以正常执行close动作。而不会造成两个线程都在操作串口。
更多追问追答
追问
说起来,串口控件放在窗体上,应该不用特殊的线程操作,况且我并没有关闭线程安全检查,如果有问题恐怕编译都不能通过。而且不能关闭串口只有在串口有数据接收时出现,平时时候是可以正常关闭串口的。
追答
串口控件虽然在窗体上,但串口的打开、数据接收和串口的关闭都是你的代码主动加的动作,
并不是拖了一个控件,串口就自己打开了,所以你可以尝试一下,不要把串口的打开、数据接收、关闭都被用户按键响应之类的线程控制,要主动做一个单纯响应串口动作的线程,在用户点击打开串口或关闭串口按钮后,向这个串口动作线程发送请求,由这个线程来完成动作。
一般的项目程序,在串口操作设计上,会设计两个线程,一个线程用来发送数据,一个线程用来接收数据,这两个线程在程序启动时并不存在,而是在某个时机成功打开串口后才启动,而当其他线程想要关闭串口的时候,就必须先终止上面这两个线程,在这两个线程完全正常停止运行后才执行close动作,如果再次打开串口再重新启动上面两个线程。
你现在想办法让程序的读串口和关闭串口的操作不要同时间发生,验证一下这么做是否就不会卡死了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询