【发布时间】:2014-02-20 00:00:30
【问题描述】:
我每秒有 5 KB 的十六进制数据从串行端口传入。每次读取的数据为 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
哪个是我正在查看的数据集的正确答案。是的,我将不得不处理停止/启动位,这并不容易。
不过,我希望 Luke 不仅仅是一组 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 个左右的组,然后将这些块放入一个向量中。
再次感谢您的帮助
【问题讨论】:
-
你必须告诉 Luke 真相才能让你的代码正常工作:-)
标签: string matlab vector concatenation