如何在Python中正确编码触发器并通过串口将它们发送到BrainVision(对OpenSesame和PsychoPy有用)

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

我将非常感谢有关使用 Python 代码将 EEG 触发器/标记发送到 BrainVision Recorder 的建议。我使用 OpenSesame 作为刺激平台。尽管 OpenSesame 没有内置支持向端口发送触发器,但可以通过使用 Python 代码来实现。但是,我还没有找到可以使用的万无一失的模板。

我们实验室中发送触发器的设置利用串行代理到并行端口。因此,从 OpenSesame 中,我使用以下代码连接到串行端口:

import serial

serialport = serial.Serial(‘COM3’)

我以二进制格式发送触发器,因为 Python 需要这样做。例如,要发送触发器 1,我运行代码

serialport.write(b’1’)
。我已经通过这种方式成功发送触发器了。然而,我遇到了两个问题。

首先,触发器的转换方式我无法完全破译。例如,当我运行代码

serialport.write(b’1’)
时,BrainVision Recorder 中显示的触发器是
S 49
,而不是我希望的
S 1
(请参阅下面的附录)。

其次,我无法依次发送两个具有相同代码的触发器。例如,如果我运行

serialport.write(b’1’)
,BrainVision Recorder 中会出现触发器,但如果我随后运行相同的操作(无论多少次),则不会出现触发器。

我尝试通过除了串口之外还打开并口来解决这些问题,但问题仍然存在。

非常感谢您的关注。

附录:Python 发送的触发器与 BrainVision 中显示的标记之间的匹配

BrainVision Recorder 中打印的标记比原始触发器中的最后一位数字大 48 个单位。如果触发器中存在多个数字,则仅考虑最后一位数字。

为了方便起见,下面的列表是代码格式的,但只有箭头之前的函数对应于实际代码。

serialport.write(b’0’) --> ‘S 48’
serialport.write(b’1’) --> ‘S 49’
serialport.write(b’2’) --> ‘S 50’
serialport.write(b’3’) --> ‘S 51’
serialport.write(b’4’) --> ‘S 52’
serialport.write(b’5’) --> ‘S 53’
serialport.write(b’6’) --> ‘S 54’
serialport.write(b’7’) --> ‘S 55’
serialport.write(b’8’) --> ‘S 56’
serialport.write(b’9’) --> ‘S 57’
serialport.write(b’10’) --> ‘S 48’
serialport.write(b’11’) --> ‘S 49’
serialport.write(b’12’) --> ‘S 50’
serialport.write(b’13’) --> ‘S 51’
serialport.write(b’14’) --> ‘S 52’
serialport.write(b’15’) --> ‘S 53’
serialport.write(b’16’) --> ‘S 54’
serialport.write(b’17’) --> ‘S 55’
serialport.write(b’18’) --> ‘S 56’
serialport.write(b’19’) --> ‘S 57’
serialport.write(b’20’) --> ‘S 48’
serialport.write(b’21’) --> ‘S 49’
serialport.write(b’22’) --> ‘S 50’
serialport.write(b’23’) --> ‘S 51’

此外,我可以通过在原始触发器中输入非数字来打印大于 57 的标记,如下所示。

serialport.write(b’@’) -->  ‘S 64’
serialport.write(b’]’) --> ‘S 93’
serialport.write(b’a’) --> ‘S 97’
serialport.write(b’m’) --> ‘S 109’
serialport.write(b’z’) --> ‘S 122’

与数字一样,仅考虑最后一项。所以,

serialport.write(b’@@’)
-->
S 64

我无法打印小于 48 或大于 125 的标记。

python encoding binary serial-port open-sesame
1个回答
1
投票

我首先在评论中建议:

serialport.write(0x01)
,但这没有帮助。然后我建议:
serialport.write(b'\x01')
,这似乎有效。

现在您有兴趣使用值

1
作为整数,但要求写入为
serialport.write(b'\x01')
。幸运的是,有内置的转换:

def serial_write(int_val):
    as_bytes = int_val.to_bytes(length=1, byteorder="big")
    serialport.write(as_bytes)

serial_write(0x01)

理论上,您可以编写:

for i in range(256): serial_write(i)
来发送 0 到 255(含)之间的所有值。 (但是,我发现您在发送多个触发器时遇到问题 - 但这是另一个问题)。

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