WindowsError последовательного порта (5, ‘Доступ запрещен.’) с многопроцессорной обработкой

У меня есть программа python, использующая последовательный порт для подключения к Arduino. Я хочу построить график некоторых данных в реальном времени, не замедляя выполнение, поэтому я пробую многопроцессорную обработку. Тем не менее, я получил ошибку

    serial.serialutil.SerialException: could not open port 'COM6': WindowsError(5, 'Access is denied.') # COM6 is the port connected to Arduino

Удивительно, но связь между Arduino все еще жива, в то время как функция в многопроцессорной обработке не работает. Мой код выглядит следующим образом,

class ArduinoThread(threading.Thread):
    def __init__(self, portnum):
        threading.Thread.__init__(self)
        self.setName("Arduino")
        self.Arduino = serial.Serial(port="COM"+str(portnum), baudrate=19200)
    def run(self):
        # some function


def MyPlot_realtime(DATA):
    while True:
        data = DATA.get(False)
        plt.plot(data)


UNO = ArduinoThread(6)
UNO.start()

plt.ion()
pltQ = multiprocessing.Queue()
pltP = multiprocessing.Process(target=MyPlot_realtime, args=(pltQ,))
pltP.start()

while True:
    # some calculation on data
    UNO.update(data)

    if pltQ.empty():
        pltQ.put(data)

Просто комментируя многопроцессорную часть, код может хорошо работать. Ошибка выскакивает, когда есть многопроцессорная обработка, но UNO.update(data)все еще работает, в то время MyPlt_realtimeкак не работает вообще.

(Мой код довольно сложен, поэтому я упростил его. Я использую другой последовательный порт для подключения другого устройства. Я также использую Tkinter. Надеюсь, что проблема не пришла из этой части)

1 ответ

  1. Поместите основной код в условие if следующим образом:

    if __name__ == '__main__':
    

    Я не уверен, почему, но это решило проблему для меня, и большинство примеров, кажется, делают это так же.