Перегрузка последовательного порта в Psychopy - PullRequest
0 голосов
/ 26 февраля 2020

Я использую блок кнопок, подключенный через последовательный порт, для запуска эксперимента в 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

Что бы я мог добавить, чтобы сделать так, чтобы не было хранения информации (если это действительно происходит)?

1 Ответ

0 голосов
/ 27 февраля 2020

Связь через последовательный порт буферизуется, что означает временное хранение сообщений. Если участник нажимает на кнопку несколько раз в испытании, эти нажатия будут сохранены в буфере. Когда вы читаете с последовательного порта, вы будете читать буферизованные сообщения.

Чтобы решить вашу проблему, вы можете очистить буфер последовательного порта в начале каждого испытания. Используйте метод serial.Serial.reset_input_buffer(), чтобы выполнить sh. Вот документация по этому методу:

reset_input_buffer()

Flu sh входной буфер, отбрасывающий все его содержимое.


А для превосходной аналогии с буферизованными коммуникациями обращайтесь к { ссылка }:

Представьте, что вы едите конфеты из миски. Вы берете одну часть регулярно. Чтобы не допустить вытекания чаши, кто-то может наполнить чашу до того, как она опустеет, поэтому, когда вы захотите взять еще один кусочек, в чаше окажется конфетка.

Чаша действует как буфер между вами и мешок конфет.

...