BadProgrammer
BadProgrammer

Reputation: 99

Attempting to read from two serial ports at once

I am trying to read from two serial ports at once. Each connected device spits out a line of data. I read the data from each port as a list and then concatenate the list and print it out as one line.

If I read each port individually, the data updates fine. But the second I attempt to read from both, it lags up and the data stops changing in the print output. The timestamp updates fine, but the data itself is what starts to lag.

Below is my code, should I be doing some sort of threading? I am reading from an Arduino and a Teensy.

import serial
import time

serA = serial.Serial('/dev/arduino', 230400)
serT = serial.Serial('/dev/teensy', 9600)

while 1 :
        timestamp = "%f" % time.time()
        print(timestamp)
        arduino = serA.readline().rstrip('\n')
        data_listA = arduino.split('$')
        teensy = serT.readline().rstrip('\n')
        data_listT = teensy.split('$')       
        data_list = data_listA + data_listT
        print(data_list)

Upvotes: 2

Views: 3604

Answers (2)

BadProgrammer
BadProgrammer

Reputation: 99

Using inwaiting() unfortunately did not work for me. I ended up having to use threading. A basic example for people who might encounter my problem is shown below.

import serial
import Queue
import threading

queue = Queue.Queue(1000)

serA = serial.Serial('/dev/arduino', 230400)
serT = serial.Serial('/dev/teensy', 9600)

def serial_read(s):
    while 1:
        line = s.readline()
        queue.put(line)

threadA = threading.Thread(target=serial_read, args=(serA,),).start()
threadT = threading.Thread(target=serial_read, args=(serT,),).start()

while 1:
    line = queue.get(True, 1)
    print line

I based my code on the last answer from this question.

Upvotes: 1

Joran Beasley
Joran Beasley

Reputation: 113930

just check to see if your serial port has bytes to read before you try to read it ...

while 1 :
    timestamp = "%f" % time.time()
    print(timestamp)
    if serA.inWaiting(): # only read if there is something waiting to be read
        arduino = serA.readline().rstrip('\n')
        data_listA = arduino.split('$')
        print("GOT ARDUINO:",data_listA)
    if serB.inWaiting():
        teensy = serT.readline().rstrip('\n')
        data_listT = teensy.split('$')         
        print("GOT TEENSY:",data_listT)

Upvotes: 1

Related Questions