将ASCII串行数据分离为单个矩阵

时间:2013-04-03 17:01:29

标签: matlab serial-port ascii scanf

这里的第一次海报。我正在使用一个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)

非常感谢任何帮助,提前致谢。

1 个答案:

答案 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