在MATLAB中使用'从串行线读取数据时解释零;fscanf';

在MATLAB中使用'从串行线读取数据时解释零;fscanf';,matlab,serial-port,arduino,scanf,null-terminated,Matlab,Serial Port,Arduino,Scanf,Null Terminated,我有一个数据流通过串行线从Arduino板传入。该流如下所示: 0x43 0x03 0x39 0x00 0x0D 0x0A 前两个字节(0x43和0x03)是单字节整数值。接下来的两个字节(0x39和0x00)是单个16位小尾端有符号整数值。最后两个字节(0x10和0x13)应该是终止符序列(“\r\n”) 我正在使用MATLAB读取这些数据。我创建一个串行连接,打开它,然后读入数据。不幸的是,我在使用0x00作为字节值时遇到了问题,因为fscanf只是将其视为字符串的空终止符 以下是一些示例

我有一个数据流通过串行线从Arduino板传入。该流如下所示:

0x43 0x03 0x39 0x00 0x0D 0x0A
前两个字节(0x43和0x03)是单字节整数值。接下来的两个字节(0x39和0x00)是单个16位小尾端有符号整数值。最后两个字节(0x10和0x13)应该是终止符序列(“\r\n”)

我正在使用MATLAB读取这些数据。我创建一个串行连接,打开它,然后读入数据。不幸的是,我在使用0x00作为字节值时遇到了问题,因为fscanf只是将其视为字符串的空终止符

以下是一些示例代码:

%Create and open serial connection
serialcon = serial('COM5');
fopen(serialcon);

firstChar = fscanf(serialcon, '%c', 1); %Read 0x43
secondChar = fscanf(serialcon, '%c', 1); %Read 0x03
integerByteChars = fscanf(serialcon, '%c', 2); %Read 0x39 and 0x00
fscanf(serialcon, '%c'); %Read until end-of-line

integerBytes = uint8(integerByteChars); %value should be (in hex): [ 0x39 0x00 ]
integerValue = typecast(integerBytes, 'uint16'); %value should be (in hex): 0x0039
不幸的是,“integerByteChars”不是我希望的2元素数组,而是1元素数组,因为
fscanf
只将0x00视为空终止字符串值。但是,这让我感到惊讶,因为我是使用“%c”而不是“%s”(用于字符串)输入数据的


我需要的是一个函数,它将这些字节作为数据读取,即使它是零字节,也不会将其丢弃。我可以使用哪些功能来实现这一点?可以强制这样做吗?

fread将是一个很好的方法

您可以使用以下命令读取所有6个字节:

 data = fread(s2,6,'uint8')
然后遍历返回的向量

 firstChar = data(1);
 secondChar = data(2);
 integerValue = data(3) + data(4) * 256;  % Need to check endian calc
 if data(5) ~= 13 || data(6) ~= 10
    error('Not terminated correctly')
 end

顺便说一句,你确定你的CR/LF ASCII值正确吗?

Oops,是的,我不小心把CR/LF字节的十进制值改为十六进制值。我已经编辑了我的原始帖子以使用正确的十六进制值。谢谢你注意到这一点。