私は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インタフェースにバッファがあり、それがどれだけ大きいか分かりません。
ターミネータを設定すると、発信メッセージに付加されたターミネータにのみ適用されます。 'fscanf()'は常にシリアル接続の入ってくるバッファの全内容を引き出します。私はそれをローカルで解析することをお勧めします。 –
構文解析に関しては、着信データはおそらく文字配列です。あなたのパーサーに一度に15バイトを渡すには: 'for i = 1:ceil(length(data)/ 15);もしlength(data)> 15ならば、 toparse = data(1:15);データ=データ(16:終了);解析する(toparse);それ以外は解析する(データ)。終了; ' –
ちょっと!大変、ありがとう。あなたがそれを言ったので明白に見えます:-)。コメントを回答として再投稿すると、その質問に回答としてマークすることができます。 :-) – Chuchaki