我正在使用MATLAB将值写入串口,我知道接收数据的设备有一个有限的输入缓冲区(比如512B)。
目前,我连接的设备已经实现了软件流控制,因此当我应该停止发送数据时它将发送XOFF
(ASCII 0x13),它将发送XON
(ASCII 0x11) )当它准备再次接收数据时。
我希望能够将值写入串口而不会溢出另一端的缓冲区。假设我想在串口上写100kB。
不幸的是,将FlowControl
对象的serial
属性设置为'software'
似乎没有任何效果。当我写数据时,设备上的输入缓冲区溢出。另外,我可以在串行对象的输入缓冲区中看到大量XON
和XOFF
个字符。
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
串行对象会在低级别实现握手。我错过了什么吗?如果没有,是否有更好的方法来实现它?