线程时串行通信中断

2024-05-12 04:31:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是USB微波源,它通过虚拟COM端口进行通信。你知道吗

通信是通过python完成的。一切正常,只要我执行代码阻塞。你知道吗

但是,只要在线程中完成任何通信 我得到一个SerialException: Attempting to use a port that is not open。有没有一个明显的原因,为什么会这样?在这段时间内,没有其他东西(至少源于我的软件)试图与端口通信。你知道吗

最高级脚本:

from serial import SerialException

import deer
import windfreak_usb

try:
    deer.mw_targets = windfreak_usb.WindfreakSynthesizer()
except SerialException:
    deer.mw_targets.port.close()
    deer.mw_targets = windfreak_usb.WindfreakSynthesizer()

deer_mes = deer.DeerMeasurement(f_start=0.9e9,
                                f_end=1.2e9,
                                df=3e6,
                                f_nv=1.704e9,
                                seq=["[(['mw'],28),([],tau),(['mw', 'mwy'],56),([],tau),(['mw'],28),([],100)]",
                                     "[(['mw'],28),([],tau),(['mw', 'mwy'],56),([],tau),(['mw'],84),([],100)]"],
                                power_nv=10,
                                power_targets=3,
                                tau=700
                                )

deer_mes.run(10e6)  # <- this works perfectly, as it is the blocking version
# deer_mes.start(10e6)  # <- raises the SerialException at the line indicated below
deer.mw_targets.port.close()

微波源的一种简化形式(windfreak)_usb.py文件)地址:

import serial

import synthesizer


class WindfreakSynthesizer(synthesizer.Synthesizer):

    def __init__(self):
        synthesizer.Synthesizer.__init__(self)
        self.port = serial.Serial(
            port='COM14',
            baudrate=9600,
            timeout=10
        )
        self.off()

    def __del__(self):
        self.port.close()

    def off(self):
        self.port.write('o0')

    def power(self, p):
        p = int(p)
        self.port.write('a{}'.format(p))

度量类的一种简化形式(鹿.py)地址:

import threading
import time

import numpy
import os
from PyQt4 import QtCore
from PyQt4.QtCore import QObject
import matplotlib.pyplot as plt
import hardware
import matpickle
import pulsed
import pulser
import savepath
import synthesizer

if 'pg' not in globals():
    pg = pulser.Pulser()

if 'mw_targets' not in globals():
    mw_targets = synthesizer.Synthesizer()

timeout = 30
CurrentMeasurement = None  # global variable pointing to the currently active measurement


class DeerMeasurement(QObject):
    update = QtCore.pyqtSignal()

    def __init__(self, f_start, f_end, df, f_nv, seq, power_nv, power_targets, tau, sweeps_per_iteration=50e3,
                 switching_time=300e-6):
        super(QObject, self).__init__()
        """ setting all parameters as self.parameter """
        self.power_targets = power_targets

        self.fs = numpy.arange(f_start, f_end + df, df)
        self.abort = threading.Event()

        self.save_deer()

    def run(self, sweeps):

        global CurrentMeasurement
        if CurrentMeasurement is not None:
            print('Deer Warning: cannot start measurement while another one is already running. Returning...')
            return
        CurrentMeasurement = self

        # Start measurement
        print('Deer measurement started.')

        mw_targets.power(self.power_targets)  # <- This causes the SerialException.

        """ Here comes the actual measurement, that is never executed, as the line above kills the thread already with the SerialException. """

    def start(self, sweeps, monitor=None):
        """Start Measurement in a thread."""
        if monitor is not None:
            monitor.register(self)
        if not hasattr(self, 'mes_thread'):
            # noinspection PyAttributeOutsideInit
            self.mes_thread = threading.Thread(target=self.run, args=(sweeps,))
            self.mes_thread.start()
        else:
            print('Already threading')

任何帮助都是非常感谢的,因为在线程外运行测量不是一个选项。你知道吗

致以最诚挚的问候!你知道吗


Tags: theimportselfisportdefnotstart