在从MATLAB中的串行端口读取期间更改BytesAvailableFcnCount

时间:2013-07-17 13:12:34

标签: matlab file-io serial-port communication serial-communication

我正在尝试在Matlab中构建串口设备。我有2个设备'COM1'和'COM2'。 'COM1'异步将数据写入串行端口'COM2'。我有“COM1”和“COM2”的替代名称,如下所示:

global serialcom
serialcom=serial('COM1'); %Serial Communication portal COM 1
global testdummy
testdummy=serial('COM2'); %Serial Communication portal COM 2

触发testdummyfunction的 testdummy 输入缓冲区中的字节数为2,这是使用testdummy.BytesAvailableFcnCount字段(如下)指定的。

testdummy.BytesAvailableFcnMode = 'Byte';
testdummy.BytesAvailableFcnCount = 2;
testdummy.BytesAvailableFcn = @testdummycomfunction;

我在 testdummy 端有一个函数“testdummyfunction”,它是使用Matlab中的BytesAvailable回调属性触发的。该函数的结构如下:

function testdummyfunction(testdummy,BytesAvailable)
% TESTDUMMYFUNCTION(testdummy,...BytesAvailable)
% INPUTS:
% TESTDUMMY:refers to the serial port testdummy
% BYTESAVAILABLE:Refers to the callback function 'BytesAvailablefunction'

    global serialcom;
    data_string=fscanf(serialcom,'%c',2); %Reads the data sent form serialcom

end

现在,假设我打印到testdummy的字符串大于2个字节,比如10个字节。由于我将数据异步写入testdummy,第一次触发字节可用函数时,从中读取2个字节。(这两个字节对我来说就像一个同步字节,如果它们是正确的,这意味着我可以读取其余的)。

现在,我想将testdummy.BytesAvailableFcnCount属性更改为8;这样我就可以阅读剩余的8个字节。但是,Matlab说我必须首先关闭串口以更改testdummy.BytesAvailableFcnCount属性。如果我这样做,那么输入缓冲区中的所有内容都将丢失! 我如何确保更改属性而不丢失输入缓冲区中的数据?

1 个答案:

答案 0 :(得分:0)

您可以将BytesAvailableFcnCount设置为1.然后使用global serialmode = 1;之类的变量在不同模式之间切换:

function testdummyfunction(testdummy,BytesAvailable)
    global serialcom;
    if (serialmode==1 && get(serialcom,'BytesAvailable')>=2)
        data_string=fscanf(serialcom,'%c',2); %Reads the data sent from serialcom
    elseif (serialmode==2 && get(serialcom,'BytesAvailable')>=8)
        data_string2=fscanf(serialcom,'%c',8); %Reads the data sent from serialcom
end

或者,如果总是发送10个字节,更快的解决方案就是将BytesAvailableFcnCount设置为10,然后读取2然后是8个字节。

另一个快速解决方案是将远程设备设置为发送8个字节而不是2个(在初始2个同步字节后只发送6个零),并且只使用BytesAvailableFcnCount = 8来处理所有内容。