我正在使用通过串行端口连接的按钮盒在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_1
,text_2
,text_3
和text_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
我可以添加些什么来使其像没有信息存储(如果这是实际发生的事情?)?
串行端口通信已缓冲,这意味着消息已临时存储。如果参与者在试验中多次按下按钮框,则这些按下将存储在缓冲区中。从串行端口读取时,将读取缓冲的消息。
为了解决您的问题,您可以在每次试用开始时清除串行端口缓冲区。使用serial.Serial.reset_input_buffer()
方法可以完成此操作。这是有关此方法的文档:
serial.Serial.reset_input_buffer()
刷新输入缓冲区,丢弃其所有内容。
关于缓冲通信的一个很好的类比,请参考reset_input_buffer()
:
想象一下,您正在从碗里吃糖果。你经常吃一块。为了防止碗快用完,有人可以在碗变空之前重新装满它,这样当您要再拿一块时,碗中就会有糖果。
碗在您和糖果袋之间起缓冲作用。