我将非常感谢有关使用 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 中会出现触发器,但如果我随后运行相同的操作(无论多少次),则不会出现触发器。
我尝试通过除了串口之外还打开并口来解决这些问题,但问题仍然存在。
非常感谢您的关注。
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 的标记。
我首先在评论中建议:
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(含)之间的所有值。 (但是,我发现您在发送多个触发器时遇到问题 - 但这是另一个问题)。