这里的第一次海报。我正在使用一个accelorometer测量三轴x,y和amp; ž。我通过pic微控制器传输三个变量,并通过UART以ASCII格式发送到我的笔记本电脑。使用fscanf命令我收到一串逗号分隔的数据,形式为x = 0000,y = 0508,z = 0000,x = 0000,y = 0503,z = 0000等...我想将信息和地点分开分成三个矩阵的形式
x = [005, 010, 000....]
; y = [503, 000, 450....]
; z = [000, 000, 500.....]
;
进一步分析,绘图等。
到目前为止,这是我的代码:
clear all;
close all;
s = serial('COM4'); %assigns the object s to serial port
set(s, 'InputBufferSize', 256); %number of bytes in inout buffer
set(s, 'FlowControl', 'hardware');
set(s, 'BaudRate', 9600);
set(s, 'Parity', 'none');
set(s, 'DataBits', 8);
set(s, 'StopBit', 1);
set(s, 'Timeout',10);
disp(get(s,'Name'));
prop(1)=(get(s,'BaudRate'));
prop(2)=(get(s,'DataBits'));
prop(3)=(get(s, 'StopBit'));
prop(4)=(get(s, 'InputBufferSize'));
fopen(s); %opens the serial port
fscanf(s)
非常感谢任何帮助,提前致谢。
答案 0 :(得分:2)
您可以使用regexp
:
>> str = 'x=0000,y=0508,z=0000,x=0000,y=0503,z=0000';
>> pat = '([xyz])=([0-9\.]*),?';
>> toks = regexp(str, pat, 'tokens')
toks =
Columns 1 through 5
{1x2 cell} {1x2 cell} {1x2 cell} {1x2 cell} {1x2 cell}
Column 6
{1x2 cell}
>> toks{1}
ans =
'x' '0000'
pat
末尾的问号使得它对您没有尾随','
的情况不敏感,并且如果您不想提取变量名称(即,在您的情况下,您可能不需要此信息,因为您知道它们总是以相同的顺序排列),然后只需移除()
周围的[xyz]
。
要以双重形式提取值,您可以执行以下操作:
newXYZ = zeros(length(toks) / 3, 1);
newFilledLocs = zeros(size(newXYZ));
curRow = 1;
for nTok = 1:length(toks)
col = [];
switch toks{nTok}{1}
case 'x', col = 1;
case 'y', col = 2;
case 'z', col = 3;
otherwise, error('Invalid variable name ''%s''', toks{nTok{1}});
end;
newXYZ(curRow, col) = str2double(toks{nTok}{2});
if all(newFilledLocs(curRow, :))
curRow = curRow + 1;
end
end