我有一门课ScaleWorker
它是在主界面中的线程中运行的辅助进程
它包含receave_scaledata
,等待从设备接收数据并将其转发给
界面
该函数在while循环中运行
条件为while my_serial.is_open and self.continue_run:
带函数
def stop_me(self):
self.continue_run = False
当从主界面发送信号以执行stop_me
时,可以停止该功能
self.continue_run = True
切换到True
,循环中断
最后它发出self.finishedworking.emit()
告诉主界面中的线程退出
self.scaleworker.finishedworking.connect(self.thread.quit)
问题是函数receave_scaledata
包含来自pyserial
的函数
data_left = my_serial.inWaiting()
此函数将永远等待,直到接收数据
如果没有传入数据,则不会执行其他代码
因此,当发送一个退出线程的信号时,该信号被卡住,直到数据进入设备,然后循环中断
我在寻找一种方法,告诉工人立即发出finishedworking
,而不被阻止
到目前为止,我找不到一条绕过它的路
这段代码在没有设备的情况下执行起来有点困难,但也许你能帮我
这是密码
import sys
import time
import re
import serial
from serial.tools import list_ports
from PyQt5 import QtWidgets as qtw
from PyQt5 import QtCore as qtc
class ScaleWorker(qtc.QObject):
work_signal = qtc.pyqtSignal(float)
finishedworking = qtc.pyqtSignal() # emmits that its finished
def __init__(self, parent=None):
super().__init__(parent=parent)
self.continue_run = False
@qtc.pyqtSlot()
def receave_scaledata(self):
try:
my_serial = serial.Serial(
port="COM 3",
baudrate=2400,
bytesize=7,
parity=serial.PARITY_NONE,
timeout=None,
stopbits=1,)
if my_serial.is_open:
print("serial open")
while my_serial.is_open and self.continue_run:
data = my_serial.read() # wait forever till data arives
time.sleep(1) # hard delay to receave all bites
data_left = my_serial.inWaiting() # wait forever
data += my_serial.read(data_left) # pack all receaved bites into on variable
self.work_signal.emit(data)
self.finishedworking.emit()
except serial.serialutil.SerialException:
print("not open")
def stop_me(self):
self.continue_run = False
我认为一个简单而健壮的方法是在串行端口上配置一个相当短的读取超时(~1秒)。您只需测试是否
len(data) == 0
,而不进一步处理(非)传入数据这样,您可以确保至少在每次超时时都能够测试停止请求
相关问题 更多 >
编程相关推荐