2

第一次在这里发海报。我正在使用加速度计来测量三个轴 x、y 和 z。我通过 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)

任何帮助将不胜感激,在此先感谢。

4

1 回答 1

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使其对没有尾随的情况不敏感',',并且如果您也不想提取变量名(即,在您的情况下,您可能不需要此信息因为您知道它们总是以相同的顺序出现),然后只需删除()around [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
于 2013-04-03T17:06:02.513 回答