串行通信和队列问题

2024-05-06 00:56:22 发布

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

我在创建多进程串行记录器时遇到一些问题。 计划:有一个独立的进程从串口读取数据,把数据放入队列。主进程在一段时间后读取整个队列并处理数据。在

但我不确定这样做是否正确,因为有时数据顺序不正确。它适用于慢速通信。在

我一定要锁东西吗?!有没有更聪明的方法?在

import time
import serial
from multiprocessing import Process, Queue

def myProcess(q):
    with serial.Serial("COM2", 115200, 8, "E", 1, timeout=None) as ser:
        while True:
            q.put("%02X" % ser.read(1)[0])



if __name__=='__main__':
    try:
        q = Queue()
        p = Process(target=myProcess, args=(q,))
        p.daemon = True
        p.start()
        data = []
        while True:
            print(q.qsize()) #!debug
            while not q.empty(): #get all data from queue
                data.append(q.get())
            #proc_data(data) #data processing
            time.sleep(1)    #emulate data processing
            del data[:]      #clear buffer
    except keyboardInterrupt:
        print("clean-up") #!debug
        p.join()

更新: 我尝试了另一个基于线程的版本(参见下面的代码),但是效果和问题相同。结转工作正常,但结转和新数据之间的一个字节总是不存在->;当main读取队列时,脚本将丢失该字节?!在

^{pr2}$

Tags: 数据fromimporttruedatatime队列queue
1条回答
网友
1楼 · 发布于 2024-05-06 00:56:22

考虑下面的代码。在

1)这两个进程是同级的;父进程只需设置它们,然后等待control-C中断所有进程

2)一个进程将原始字节放入共享队列

3)数据第一个字节的其他proc块。当它得到第一个字节时,它将获取其余的数据,以十六进制输出,然后继续。在

4)父进程只设置其他进程,然后使用signal.pause()等待中断

注意,使用multiprocessingqsize()(可能还有{})函数是不可靠的,因此上面的代码将可靠地获取您的数据。在

来源

import signal, time
import serial
from multiprocessing import Process, Queue

def read_port(q):
    with serial.Serial("COM2", 115200, 8, "E", 1, timeout=None) as ser:
        while True:
            q.put( ser.read(1)[0] )

def show_data(q):
    while True:
        # block for first byte of data
        data = [ q.get() ]
        # consume more data if available
        try:
            while True:
                data.append( q.get_nowait() )
        except Queue.Empty:
            pass
        print 'got:', ":".join("{:02x}".format(ord(c)) for c in data)

if __name__=='__main__':
    try:
        q = Queue()
        Process(target=read_port, args=(q,)).start()
        Process(target=show_data, args=(q,)).start()

        signal.pause()          # wait for interrupt

    except KeyboardInterrupt:
        print("clean-up") #!debug

相关问题 更多 >