Steve
Steve

Reputation: 327

Pyserial/Eye-tracker: Reading from serial port whilst displaying stimuli

I am using Pyserial (+Python 2.7) to read in eye-tracking coordinates taken from an eye-tracker (CRS Live-Track set as serial port). Using the code below I am able to successfully start the tracker, read/save a line of coordinates, stop the tracker, and close. My problem is I need to continuously read in the coordinates whilst carrying out other tasks such as stimuli display. As it stands, I can't do anything whilst I'm reading in data ('trial1 = ser.readline'). I have to wait until I've read in the data before I continue. Is there a way to read in the data from the serial port continuously whilst I am displaying stimuli/collecting responses etc.?

I need to turn the tracker on, collect the data for the duration of the trial, and then tracker off.

import serial, time

ser = serial.Serial(
    port='COM3',
    baudrate=9600,
    parity=serial.PARITY_ODD,
    stopbits=serial.STOPBITS_TWO,
    bytesize=serial.SEVENBITS,
)

x = ser.is_open #check port is open
if x:
    print "port is open"

print "port name is: %s" %(ser.name)  #check which port

ser.flushInput()
ser.flushOutput()

running = True
while running:

    ser.write('$Raw\r')                 #start eye-tracker
    trial1 = ser.readline()             #read a line

    ###i need to do stuff here###

    ser.write('$Stop\r')                #stop eye-tracker

    running = False

ser.flushInput()
ser.flushOutput()

print trial1                          #print coordinates output 

ser.close()

Cheers, Steve

Upvotes: 0

Views: 236

Answers (2)

brittAnderson
brittAnderson

Reputation: 1473

Another option would be to try threads. You could put your eye tracker in one thread and the rest of your code in another. There is a stack overflow answer about multithreading (not using psychopy and eye trackers) from 2010. If you scroll down you will see that someone links to a blog post about an updated approach that they think is easier.

Upvotes: 1

Michael MacAskill
Michael MacAskill

Reputation: 2421

ioHub by Sol Simpson provides asynchronous device monitoring from within PsychoPy. i.e it operates on an entirely separate process so you don't have to pause while monitoring the port in the main PsychoPy thread.

Serial port documentation in ioHub seems scarce but there is a demo here: https://github.com/psychopy/psychopy/blob/master/psychopy/demos/coder/iohub/serial/customparser.py

Upvotes: 1

Related Questions