如何在写入串口

时间:2016-06-29 21:52:33

标签: matlab serial-port

我正在使用MATLAB将值写入串口,我知道接收数据的设备有一个有限的输入缓冲区(比如512B)。

目前,我连接的设备已经实现了软件流控制,因此当我应该停止发送数据时它将发送XOFF(ASCII 0x13),它将发送XON(ASCII 0x11) )当它准备再次接收数据时。

我希望能够将值写入串口而不会溢出另一端的缓冲区。假设我想在串口上写100kB。

不幸的是,将FlowControl对象的serial属性设置为'software'似乎没有任何效果。当我写数据时,设备上的输入缓冲区溢出。另外,我可以在串行对象的输入缓冲区中看到大量XONXOFF个字符。

Matlab Documentation,在这方面缺乏。它只提到了在读取大量数据时如何处理软件流控制。此外,它的编写方式使得所有控件似乎都是手动的。将FlowControl对象的serial属性设置为software与将其设置为none相比有何不同?

我试图将我自己的软件握手破解如下:

function write_lots_of_data(serial, string)
    % only write 128B at a time so the buffer does not overflow
    WRITE_SIZE = 128;
    nData = numel(string);
    isReady = is_serial_ready(serial, true);
    for iStart = 1:WRITE_SIZE:nData
        while ~isReady
            isReady = is_serial_ready(serial, isReady);
        end
        iEnd = min(iStart+WRITE_SIZE-1, nData);
        fprintf(serial, '%s', data(iStart:iEnd));
        isReady = is_serial_ready(serial, isReady);
    end
end


function tf = is_serial_ready(serial, tf)
    if serial.BytesAvailable
        input = fread(serial, serial.BytesAvailable);
        % get the last XON or XOFF character
        c = response(find(response == 17 | response == 19, 1, 'last'));
        % only change the output if you actually found one
        if ~isempty(c)
            tf = c == 17;
        end
    end
end

此解决方案非常低效,并且不具备防弹功能。我认为MATLAB串行对象会在低级别实现握手。我错过了什么吗?如果没有,是否有更好的方法来实现它?

0 个答案:

没有答案