Matlab与BrainVision脑电信号录制软件的并口通信
Matlab中可以使用io64包向并口发送数据。
io64是一个可以用作并口通信的包,其使用方法在官网有清楚的介绍。此文写作时io64包的官网挂了,可以使用互联网档案馆-io64官网20180309002101归档
下文中BrainVision脑电信号记录软件简称为Recorder。
在Matlab通过io64与Recorder的通讯过程中,信号使用并口发送,程序向Recorder发送一次Marker的通信过程如下(由测试经验得出,无官方文档):
- 拉高并口电平,即发送数据信号,如代码
io64(ioObj, address, singal);
; - 等待一段时间,这段时间可能与Recorder刷新率有关;
- 拉低并口电平,即结束此次数据发送,代码
io64(ioObj, address, 0);
。
Recorder记录到Marker的时间是接收到第一步程序发出的电信号的时间。发送的信号最大为8个比特位,即十进制数字区间[0, 255]。
第二步等待一段时间仅仅是为了确保Recorder成功接收到了信号,建议最短不要低于0.001(测试经验所得,无文档,可能与并口线长度等有关)。
第三步拉低电平是为了结束一次数据发送,理论上第一步与第三步之间的时间(即第二部的等待时间)可以很长,测试过程中等待2秒无异常。因此第三步拉低电平的信号可以在结束一个trial之后发送,以免影响到实验过程中trial的onset或者response时间。
如果不进行第三步拉低电平的操作,Recorder虽然能够正常显示下一次发送的Marker,但是在Marker日志中会出现伪信号导致的异常Marker。
综上,给出两个demo。由于第二种没有额外等待时间的影响,因此记录各时间节点时不需要花太多精力考虑时间误差的问题。
1. 发送信号结束后开始trial
address = hex2dec('D010');
ioObj = io64();
status = io64(ioObj);
for i = 0:1e10
marker = mod(i, 9) + 1;
io64(ioObj, address, marker);
WaitSecs(0.004);
io64(ioObj, address, 0);
% Trial start
WaitSecs(2);
end
2. 拉高电平后开始trial,结束trial后拉低电平
address = hex2dec('D010');
ioObj = io64();
status = io64(ioObj);
for i = 0:1e10
marker = mod(i, 9) + 1;
io64(ioObj, address, marker);
% Trial start
WaitSecs(2);
io64(ioObj, address, 0);
end