Neutree / COMTool

Cross platform communicate assistant(Serial/network/terminal tool)( 跨平台 串口调试助手 网络调试助手 终端工具 linux windows mac Raspberry Pi )支持插件和二次开发
https://neucrack.com/p/186
GNU Lesser General Public License v3.0
1.8k stars 330 forks source link

receiveData咨询 #5

Closed jackgreentemp closed 5 years ago

jackgreentemp commented 6 years ago

首先感谢分享 receiveData 函数中有一句 time.sleep(0.009),想请教一下这句的作用是什么?还有就是0.009是怎么计算出来的呢?

Neutree commented 6 years ago

在C++中可能会设置串口中断回调函数,这样串口数据到达后就可以立马获得数据;

但是python中我使用了一个比较简单粗暴的方法,就是开了一个线程死循环读取串口,这样做的好处就是简单可靠,但是缺点就是因为是死循环,性能会有问题,CPU占用会过高,所以在这里延时了一下下释放一下CPU占用,至于为啥是0.009,是我看着CPU使用率以及不停地给串口发数据综合的情况下取的一个值2333333

如果你有什么更好的解决办法就更好了

Neutree commented 6 years ago

其实也许可以用read函数阻塞等待更好 http://pyserial.readthedocs.io/en/latest/pyserial_api.html#serial.Serial.read

jackgreentemp commented 6 years ago

感谢回复,pyserial这个没有中断回调好坑...

使用read阻塞等待应该能减少while循环次数,但是这儿有一个疑问:如果不用线程,而是用QTimer做一个定时器,比如每隔100ms去读一下串口的数据,然后数据处理逻辑不变,这种使用定时器的方式和线程+while死循环比较,哪种方式更合理一点?

貌似官方示例都是线程+while死循环的方式,感觉使用定时器的方式在某些应用场景是可以的,比如某些要实时显示传感器数据的应用,这种应用数据发送频率应该是固定的

最近遇到的问题就是这种应用里遇到的,应用大概是这么样:硬件那边通过串口不停地发送数据,上位机这边要接收数据并实时显示曲线,现在上位机程序跑一会儿就死了...任务管理器中是程序无响应...控制台还不报任何错

Neutree commented 6 years ago

是的,pyserial没有事件,都是死循环读取。

两种方式都可以的,看你具体的要求了,反正串口助手为了实时性死循环更好,你的程序没有响应可能引起的原因很多了,多半是你的UI显示的问题,这个得你自己多调试调试找问题了

jackgreentemp commented 6 years ago

嗯,非常感谢 特别诡异的是,接收数据线程不加time.sleep,程序就能多跑一会儿...

Neutree commented 5 years ago

加sleep界面会死掉多半就是你的sleep是在UI线程调用的了~~