0

我正在尝试在 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

触发 testdummy 函数的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 个字节。(这 2 个字节对我来说就像一个同步字节,如果它们正确,则意味着我可以读取其余部分)。

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

4

1 回答 1

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。

于 2013-07-17T13:38:06.150 回答