2

初ポスターはこちら。加速度計を使用して、x、y、z の 3 軸を測定しています。pic マイクロコントローラーを介して 3 つの変数をストリーミングし、UART 経由で ASCII 形式でラップトップに送信しています。fscanf コマンドを使用して、x=0000、y=0508、z=0000、x=0000、y=0503、z=0000 などの形式のコンマ区切りデータの文字列を受け取りました。情報を分離して配置したいx = の形式の 3 つの行列に変換し[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]です。

double 形式で値を抽出するには、次のようにします。

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 に答える