混合多处理和串行端口

2024-09-28 17:02:05 发布

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

我写了一个继承多进程(). 它有一个序列号。序列号()类属性中的对象。方法自循环()应该读写串行端口。什么时候自循环()被调用,它应该作为一个单独的进程运行,这是要求我写这篇文章的人的要求。但是,我的代码产生了一个奇怪的错误。在

这是我的代码:

from multiprocessing import Process

import serial
import time


class MySerialManager(Process):
    def __init__(self, serial_port, baudrate=115200, timeout=1):
        super(MySerialManager, self).__init__(target=self.loop)
        # As soon as you uncomment this, you'll get an error.
        # self.ser = serial.Serial(serial_port, baudrate=baudrate, timeout=timeout)

    def loop(self):
        # Just some simple action for simplicity.
        for i in range(3):
            print("hi")
            time.sleep(1)


if __name__ == "__main__":
    msm = MySerialManager("COM14")
    try:
        msm.start()
    except keyboardInterrupt:
        print("caught in main")
    finally:
        msm.join()

这是错误:

^{pr2}$

我还尝试在类之外创建一个串行端口对象并将其传递给构造函数。而且,我试着不继承多进程()但相反地:

self.proc = Process(target=self.loop)

进入课堂

try:
    msm.proc.start()
except KeyboardInterrupt:
    print("caught in main")
finally:
    msm.proc.join()

进入主街区。他们俩都没有解决这个问题。在

有人指出,将多处理和串行端口混合在一起似乎行不通。是真的吗?如果是的话,你能解释一下为什么这不起作用吗?非常感谢任何帮助!在


Tags: 端口inimportselfloop进程maintimeout
1条回答
网友
1楼 · 发布于 2024-09-28 17:02:05

在windows中,串行对象一旦创建就不能在两个进程(即父进程和子进程)之间共享 因此,在子进程中创建串行对象,并将该对象的引用作为参数传递给其他函数

试试这个:

from multiprocessing import Process

import serial
import time


class MySerialManager(Process):
    def __init__(self, serial_port, baudrate=115200, timeout=1):
        super(MySerialManager, self).__init__(target=self.loop_iterator,args=(serial_port, baudrate, timeout))
        # As soon as you uncomment this, you'll get an error.
        # self.ser = serial.Serial(serial_port, baudrate=baudrate, timeout=timeout)

    def loop_iterator(self,serial_port, baudrate,timeout):
        ser = serial.Serial(serial_port, baudrate=baudrate, timeout=timeout)
        self.loop(ser)

    def loop(self,ser):
        # Just some simple action for simplicity.
        # you can use ser here
        for i in range(3):
            print("hi")
            time.sleep(1)


if __name__ == "__main__":
    msm = MySerialManager("COM4")
    try:
        msm.start()
    except KeyboardInterrupt:
        print("caught in main")
    finally:
        msm.join()

相关问题 更多 >