我有此类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
答案 0 :(得分:0)
一种简单但可靠的方法是在串行端口上配置较短的读取超时(〜1秒)。您只需要测试是否iris[duplicated(iris)]
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1: 5.8 2.7 5.1 1.9 virginica
,就不必进一步处理(非)传入数据。
这样,您可以确保至少在每次出现超时时都能够测试停止请求。