【发布时间】:2018-04-04 21:17:07
【问题描述】:
我有一个不定期输出数据的设备。我想以 2 秒的间隔将数据写入 csv。所以我认为使用队列进行多处理可能会起作用。
在这里,我试图将数据从一个进程传递到另一个进程,但我得到了串行异常。另外,我无法在 IDLE 上运行它。所以我坚持使用终端。因此,错误消息一打开就关闭。
代码如下:
import multiprocessing
import time
import datetime
import serial
try:
fio2_ser = serial.Serial("COM3",
baudrate=2400,
bytesize=serial.EIGHTBITS,
parity =serial.PARITY_ODD)
except serial.SerialException:
print("FiO2 Analyser Device not detected")
def Read_Data(q):
global fio2_ser
while True:
try:
fio2_data = fio2_ser.readline().decode('utf-8')
fio2_data = str(fio2_data).replace("\r\n","")
fio2_data = fio2_data.replace("\x000","")
except:
fio2_data = "FiO2 Data Unavailable"
q.put(fio2_data)
def Disp_Data(q):
while q.empty() is False:
fio2_data = q.get()
print(fio2_data)
time.sleep(2)
if __name__ == "__main__":
q = multiprocessing.Queue()
p1 = multiprocessing.Process(target=Read_Data, args=(q,))
p2 = multiprocessing.Process(target=Disp_Data, args=(q,))
p1.start()
p2.start()
p1.join()
p2.join()
当我运行一个单独的模块来收集数据时,它运行良好并收集数据。
import serial
try:
fio2_ser = serial.Serial("COM3",
baudrate=2400,
bytesize=serial.EIGHTBITS,
parity =serial.PARITY_ODD)
except serial.SerialException:
print("FiO2 Analyser Device not detected")
def Reader():
global fio2_ser
try:
fio2_data = fio2_ser.readline().decode('utf-8')
fio2_data = str(fio2_data).replace("\r\n","")
fio2_data = fio2_data.replace("\x000","")
return fio2_data
except:
return "FiO2 Data Unavailable"
if __name__ =='__main__':
value = Reader()
print(value)
【问题讨论】:
-
哪个平台?这是窗户吗?在启动子进程之前,您在模块级别打开串行端口。那不应该只是在串行阅读器功能中吗?
-
在
Read_Data()进程中初始化您的整个串行接口 - 一旦启动,它就不会共享在您的主进程中建立的连接。 -
是的,我使用的是 Windows。不,它没有用。我把它放在 Read_data 函数的 try 块中。还是一样的输出
标签: multithreading python-3.x queue python-multiprocessing pyserial