2016-09-03 9 views
0

私はArduinoのようなプラットフォームからMatlabにデータストリームを取得しようとしています。 matlabに15バイトのデータパケットを読み込ませ、それらを解析して次のチャンクを読み込ませます。Matlab:ラインフィードでfscanf()が停止しない

現在、私は、バッファがいっぱいになるまで、matlabは読み込みを停止しないという問題があります。 Matlabの横に

マイセットアップ:ハードウェア側では

s=serial('COM25','BaudRate',115200, 'Terminator', 'LF') 
fopen(s) 
data=fscanf(s) 

usbMsg[0] = 0xA0; 
    usbMsg[1] = _packetCounter; 
    // ch1 
    usbMsg[2] = in[3]; 
    usbMsg[3] = in[4]; 
    usbMsg[4] = in[5]; 
    // ch2 
    usbMsg[5] = in[6]; 
    usbMsg[6] = in[7]; 
    usbMsg[7] = in[8]; 
    // ch3 
    usbMsg[8] = in[9]; 
    usbMsg[9] = in[10]; 
    usbMsg[10] = in[11]; 
    // ch4 
    usbMsg[11] = in[12]; 
    usbMsg[12] = in[13]; 
    usbMsg[13] = in[14]; 

    usbMsg[14] = '\n'; // LF 

    SerialUSB.write(usbMsg, 15); 

"usbMsg" と "中" であり、バイト配列。

fscanf()コマンドは、1つのメッセージを返す代わりに、引き続き読み取りを行います。どうやらそれはターミネーターを認識しません。

「LF/CR」「CR」「LF」とそのASCII同等物 私はさまざまなターミネーターを試してみました。

問題がどこに見えるのですか?

ありがとうございます!

編集:

バッファに関する追加の質問があります。 シリアルポート(matlab内のシリアルオブジェクト)のバッファサイズをわずか15バイトに減らしてそれらを読み続けると、データが失われますか?

私は、USBインタフェースにバッファがあり、それがどれだけ大きいか分かりません。

+1

ターミネータを設定すると、発信メッセージに付加されたターミネータにのみ適用されます。 'fscanf()'は常にシリアル接続の入ってくるバッファの全内容を引き出します。私はそれをローカルで解析することをお勧めします。 –

+1

構文解析に関しては、着信データはおそらく文字配列です。あなたのパーサーに一度に15バイトを渡すには: 'for i = 1:ceil(length(data)/ 15);もしlength(data)> 15ならば、 toparse = data(1:15);データ=データ(16:終了);解析する(toparse);それ以外は解析する(データ)。終了; ' –

+0

ちょっと!大変、ありがとう。あなたがそれを言ったので明白に見えます:-)。コメントを回答として再投稿すると、その質問に回答としてマークすることができます。 :-) – Chuchaki

答えて

1

ターミネータを設定すると、発信メッセージに付加されたターミネータにのみ適用されます。 fscanf()は、シリアル接続の受信バッファの全内容を常にプルします。私はそれをローカルで解析することをお勧めします。

構文解析に関しては、入力データはおそらく文字配列です。

for i = 1:ceil(length(data)/15) 
    if length(data) >15 
     toparse = data(1:15); 
     data = data(16:end); 
     parse(toparse); 
    else 
     parse(data); 
end 
関連する問題