Matlab与BrainVision脑电信号录制软件的并口通信

Matlab中可以使用io64包向并口发送数据。
io64是一个可以用作并口通信的包,其使用方法在官网有清楚的介绍。此文写作时io64包的官网挂了,可以使用互联网档案馆-io64官网20180309002101归档

下文中BrainVision脑电信号记录软件简称为Recorder。

在Matlab通过io64与Recorder的通讯过程中,信号使用并口发送,程序向Recorder发送一次Marker的通信过程如下(由测试经验得出,无官方文档):

  1. 拉高并口电平,即发送数据信号,如代码io64(ioObj, address, singal);
  2. 等待一段时间,这段时间可能与Recorder刷新率有关;
  3. 拉低并口电平,即结束此次数据发送,代码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

Tag: none

Leave a new comment