Python 使用asyncio读取串行端口的输出

Python 使用asyncio读取串行端口的输出,python,python-3.x,pyserial,python-asyncio,Python,Python 3.x,Pyserial,Python Asyncio,我一直在做一些端口读取的工作,我需要知道我是否应该使用asyncIO来读取来自这个端口的数据 下面是关于系统构造方式的一些细节 多个传感器同时被读取,可能会产生同时输入的输出。(所有数据通过连接到usb端口的probee ZU10输入)所有数据必须在输入后立即加上时间戳 数据应该经过处理,然后通过RESTAPI发送到django webapp 问题是,不要丢失任何数据非常重要,我之所以问这个问题,是因为我相信一定有比我现在想的更简单的方法 我希望数据进入的方式是通过一个异步进程,该进程将数据引入

我一直在做一些端口读取的工作,我需要知道我是否应该使用asyncIO来读取来自这个端口的数据

下面是关于系统构造方式的一些细节

  • 多个传感器同时被读取,可能会产生同时输入的输出。(所有数据通过连接到usb端口的probee ZU10输入)所有数据必须在输入后立即加上时间戳

  • 数据应该经过处理,然后通过RESTAPI发送到django webapp

  • 问题是,不要丢失任何数据非常重要,我之所以问这个问题,是因为我相信一定有比我现在想的更简单的方法

    我希望数据进入的方式是通过一个异步进程,该进程将数据引入队列并对其加上时间戳,这样就不会出现数据丢失的情况,并且时间戳可能不会超过几秒钟,这不是一个问题

    如果有人有任何想法,我会感谢他们

    下面是我用来打开端口、接收数据的代码,以及到目前为止我在实际读取有意义的数据方面得到的信息

    以下是阅读部分:

    import serial #for port opening
    import sys #for exceptions
    
    #
    
    #configure the serial connections (the parameters differs on the device you are connecting to)
    
    class Serializer: 
        def __init__(self, port, baudrate=9600, timeout=.1): 
            self.port = serial.Serial(port = port, baudrate=baudrate, 
            timeout=timeout, writeTimeout=timeout)
    
        def open(self): 
            ''' Abre Puerto Serial'''
            self.port.open()
    
        def close(self): 
            ''' Cierra Puerto Serial'''
            self.port.close() 
    
        def send(self, msg):
            ''' envía mensaje a dispositivo serial'''
            self.port.write(msg)
    
        def recv(self):
            ''' lee salidas del dispositivo serial '''
            return self.port.readline()
    
    PORT = '/dev/ttyUSB0' #Esto puede necesitar cambiarse
    
    
    # test main class made for testing
    def main():
        test_port = Serializer(port = PORT)
    
        while True:
            print(test_port.recv())
    
    if __name__ == "__main__":
        main()
    
    还有一点我将要用来过滤掉有意义的读取(请注意,它可能充满了可怕的错误,可能是一个可怕的正则表达式):


    我正在使用asyncio读取/写入带有pyserial的串行端口。我让串行连接另一端的设备在准备接收有效负载时写入一个字节。Asyncio监视该字节,然后发送有效负载。它看起来像这样:

    serial_f = serial.Serial(port=dev, baudrate=BAUDRATE, timeout=2)
    
    def write_serial():
        status = serial_f.read(1)
        serial_f.write(buffer)
    
    loop = asyncio.get_event_loop()
    loop.add_reader(serial_f.fileno(), write_serial)
    

    您当然可以使用
    asyncio
    从串行端口读取数据,尽管我认为您不能使用pyserial。看见不过,我不认为使用
    asyncio
    会使您的任务变得更简单或更安全(就不丢失数据而言)。在9600波特时,字节最多为1个/ms,这应该不会太糟糕(如果可能不美观的话)。串行端口通常也有缓冲区,如果您想在另一个线程/进程中进行阻塞读取,您可以实现自己的(任意大小)。串行端口缓冲区是自动实现的还是我应该查找它们?正如Nick T所说,您应该设置一个专门用于读取的线程,只需使用PySerial即可。是数据流,延迟是否重要?如果答案是“是”和“否”,那么最简单的方法就是读取一个固定大小的块并立即将其转储到队列中。否则,答案可能是询问有多少个字符可用,然后读入max(avail,1)(如果没有可用数据,它将阻塞),然后将可变大小的字符串放入队列。此外,如果您对发送设备有任何控制,您可以添加简单的错误检测,或者进行前向纠错和/或重传。
    serial_f = serial.Serial(port=dev, baudrate=BAUDRATE, timeout=2)
    
    def write_serial():
        status = serial_f.read(1)
        serial_f.write(buffer)
    
    loop = asyncio.get_event_loop()
    loop.add_reader(serial_f.fileno(), write_serial)