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

时间:2015-08-03 18:01:14

标签: python python-3.x pyserial python-asyncio

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

以下是有关系统构建方式的一些细节。

  1. 正在同时读取多个传感器,并可能产生同时进入的输出。 (所有数据都通过连接到USB端口的探测器ZU10进入)所有数据一进入就必须加上时间戳。

  2. 应该处理数据,然后通过REST API将数据发送到django webapp。

  3. 事情是,重要的是不要丢失任何数据,我问这个是因为我相信必须有一个比我想到的更简单的方法。

    我希望数据进入的方式是通过异步过程将数据接收到队列中并对其加时间戳,这样就不会出现数据丢失的情况,并且时间戳可能不会超过几分之一秒,这不是问题。

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

    这是我用来打开端口的代码,获取数据以及到目前为止我在实际读取有意义的数据时所获得的代码。

    这是阅读部分:

    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()
    

    还有一些我将要用来过滤掉有意义的读取(忍受它,它可能充满了可怕的错误,也许是一个可怕的RegEx):

    import re
    from Lector import ChecaPuertos
    from Lector import entrada
    
    
    patterns = [r'^{5}[0-9],2[0-9a-fA-F] $'] #pattern list
    
    class IterPat:
        def __init__(self, lect, pat = patterns):
            self.pat = pat  # lista de patrones posibles para sensores
            self.lect = lect  # lectura siendo analizada
            self.patLen = len(pat)  #Largo de patrones
    
        def __iter__(self):
            self.iteracion = 0 #crea la variable a iterar.
    
        def __next__(self):
            '''
            Primero revisa si ya pasamos por todas las iteraciones posibles
            luego revisa si la iteración es la que pensabamos, de ser así regresa una
            tupla con el patrón correspondiente, y la lectura
            de otra forma para el valor de ser mostrado
            '''
            pattern = re.compile(self.pat[self.iteracion])
            comp = pattern.match(self.lect)
            if comp == True:
                re_value = (self.pattern, self.lect)
                return re_value
            else:
                self.iteración += 1
    
    def main():
        puerto = ChecaPuertos.serial_ports()
        serial = entrada.Serializer(port = puerto[0])
    
        if serial != open:
            serial.open()
        while True:
            iter = IterPat()
    
         #This is incomplete right here.
    

1 个答案:

答案 0 :(得分:2)

我正在使用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)