Psychopy中的串行端口超载

问题描述 投票:0回答:1

我正在使用通过串行端口连接的按钮盒在Psychopy中运行实验。

from binascii import hexlify
import serial
import serial.tools.list_ports as port_list
ports = list(port_list.comports()) # search for the devices
#for p in ports: print (p)

ser = serial.Serial('/dev/ttyUSB0', 19200, bytesize=8, parity='N', stopbits=1, timeout=0)


if(ser.isOpen() == False): #open the serial port only if NOT open yet
    ser.open()

ser.flush()

在实验中,我有4个例程。假设每个例程包含一个书面文本,分别为text_1text_2text_3text_4。例如,如果参与者位于text_1中,并且他/她单击了按钮,则实验移至text_2

但是,我面临以下问题。如果参与者在text_1中并快速按下两次按钮,则实验将移至text_3而不是text_2,就好像是正在存储信息一样。相反,我想如果您在text_1中并且按两次,则仅考虑第一次按。

每个text代码都是这样

ser.flush()

for line in ser.read(1):
    hex = hexlify(line)
    num_1=int(hex, 16)
    continueRoutine = False #this makes the experiment go to the next text

我可以添加些什么来使其像没有信息存储(如果这是实际发生的事情?)?

python python-2.7 serial-port pyserial psychopy
1个回答
0
投票

串行端口通信已缓冲,这意味着消息已临时存储。如果参与者在试验中多次按下按钮框,则这些按下将存储在缓冲区中。从串行端口读取时,将读取缓冲的消息。

为了解决您的问题,您可以在每次试用开始时清除串行端口缓冲区。使用serial.Serial.reset_input_buffer()方法可以完成此操作。这是有关此方法的文档:

serial.Serial.reset_input_buffer()

刷新输入缓冲区,丢弃其所有内容。


关于缓冲通信的一个很好的类比,请参考reset_input_buffer()

想象一下,您正在从碗里吃糖果。你经常吃一块。为了防止碗快用完,有人可以在碗变空之前重新装满它,这样当您要再拿一块时,碗中就会有糖果。

碗在您和糖果袋之间起缓冲作用。

© www.soinside.com 2019 - 2024. All rights reserved.