Arduinoボードからシリアルラインを介してデータの流れが入ってきました。'fscanf'を使用してMATLABのシリアルラインからデータを読み込むときにゼロを解釈する
0x43 0x03 0x39 0x00 0x0D 0x0A
最初の2バイト(0x43この及び0×03)は、シングルバイトの整数値である:ストリームは次のようになります。次の2バイト(0x39と0x00)は、単一の16ビットのリトルエンディアン符号付き整数値です。最後の2バイト(0x10と0x13)はターミネータシーケンス( "\ r \ n")です。
私はこのデータを読み込むためにMATLABを使用しています。私はシリアル接続を作成し、それを開き、データを読み込みます。残念ながら、fscanfは単に文字列のヌルターミネータであるとみなすため、0x00をバイト値として使用する際に問題が発生しています。ここで
は、いくつかのサンプルコードです:
%Create and open serial connection
serialcon = serial('COM5');
fopen(serialcon);
firstChar = fscanf(serialcon, '%c', 1); %Read 0x43
secondChar = fscanf(serialcon, '%c', 1); %Read 0x03
integerByteChars = fscanf(serialcon, '%c', 2); %Read 0x39 and 0x00
fscanf(serialcon, '%c'); %Read until end-of-line
integerBytes = uint8(integerByteChars); %value should be (in hex): [ 0x39 0x00 ]
integerValue = typecast(integerBytes, 'uint16'); %value should be (in hex): 0x0039
fscanf
ので残念ながら、何が起こることがちょうど「integerByteChars」私はそれがしたいと2要素の配列ではなく、1要素の配列であります0x00はヌル終端の文字列値と見なされます。しかし、私は '%s'(文字列に使われる)ではなく '%c'を使ってデータを入力しているので、私は驚いています。
私が必要とするのは、ゼロバイトであってもそれを放棄しないとしても、これらのバイトをデータとして読み取る関数です。それにはどのような機能がありますか? fscanfは強制的にそうすることができますか?
おっと、はい、誤って、16進値の代わりにCR/LFバイトの小数点を入れました。元の投稿を編集して正しい16進数値を使用しました。それに気づいてくれてありがとう。 – David