我每秒从串口输入5千字节的十六进制数据。每次读取数据为16位(2字节)。我需要6个读数,然后是停止/启动位。原始数据如下所示:
FF230008FF5800DD00F8000A41FF230008FF5800DE00FD000C41....
我会分手以便更好地理解:
FF23 0008 FF58 00DD 00F8 000A **41** FF23 0008 FF58 00DE 00FD 000C **41**....
空间介于我需要的数据之间。 **表示开始/停止位。
问题:
我有一段时间将字符串分成我可以使用和绘制的部分。我想将字符串压缩为大小为[6,长度(数据)]的矩阵。上一个字符串在我脑海中看起来像这样:
FF23 , 0008 , FF58 , 00DD , 00F8 , 000A
FF23 , 0008 , FF58 , 00DE , 00FD , 000C
....
我的失败尝试
for i = 1:(length(Vader)-4)
Luke= Vader(i:i+3);
i = i+4;
end
Luke
它输出:
00A4
我正在查看的数据集的正确答案是什么。是的,我将不得不处理停止/启动位,这并不容易。
不过,我希望卢克不仅仅是一组4个字符。我需要的是至少一个向量,而不仅仅是一个字符串。我试过这个:
HanSolo = floor(length(Vader)/4);
for j = 1:HanSolo
for i = 1:(length(Vader)-4)
Luke(j) = Vader(i:i+3);
i = i+4;
end
j = j+1;
end
Luke
但我得到这个错误:
??? Subscripted assignment dimension mismatch.
Error in ==> hex_conversion at 19
Luke(j) = Vader(i:i+3);
是的,MatLab,我知道尺寸不匹配。这就是我想要做的事情。
问题
基本上,在我将一个字符串缩减为一个向量之后,逐个字符让我们说,如何创建一个集中了Luke(j)= Vader(i:i + 3)的新向量?
感谢您提供任何帮助,我很感激。
修改
我尝试使用以下算法:Praetorian并且它不起作用。 reshape()在这里使用不正确,因为我输入的字符串是从串口进入的26位可变数字。请参见此处的示例:
30008FF5A00DB00F9000A41
for clarity:
3 0008 FF5A 00DB 00F9 000A **41**
这些不时出现,因为这是现实世界,错误比比皆是。
我不是要求错误检查,我仍然问如何取一个字符串,将其解析为4个左右的组,然后将这些块放入向量中。
再次感谢您提供的任何帮助
答案 0 :(得分:0)
我认为这就是你要找的东西;不知道这是否是最快的解决方案...
% I duplicated the input you provided thrice
in = [...
'FF230008FF5800DD00F8000A41FF230008FF5800DE00FD000C41' ...
'FF230008FF5800DD00F8000A41FF230008FF5800DE00FD000C41' ...
'FF230008FF5800DD00F8000A41FF230008FF5800DE00FD000C41'];
% Reshape the vector of chars into 6 rows
in = reshape(in, size(in, 2)/6, 6)';
% Trim the trailing stop bits
in = in(:,1:end-2);
% Reshape it into a vector so we can get sscanf to read it
in = reshape(in', 1, prod(size(in)));
% Read 4 hex chars at a time and reshape the result into a matrix
out = reshape(sscanf(in, '%4x'), size(in, 2)/(4 * 6), 6)'
结果:
out =
65315 8 65368 221 248 10
65315 8 65368 222 253 12
65315 8 65368 221 248 10
65315 8 65368 222 253 12
65315 8 65368 221 248 10
65315 8 65368 222 253 12