线程时串行通信中断

时间:2018-03-16 19:13:00

标签: python multithreading serial-port python-multithreading virtual-serial-port

我正在使用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))

缩小形式的测量类(deer.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')

非常感谢任何帮助,因为在线程外运行测量不是一种选择。

祝你好运!

0 个答案:

没有答案