2012-03-14 3 views
2

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は強制的にそうすることができますか?

答えて

2

freadがこれを行う良い方法です。

data = fread(s2,6,'uint8') 

をしてから返されたベクトルを介して動作:

あなたは持つすべての6つのバイトを読むことができました。

firstChar = data(1); 
secondChar = data(2); 
integerValue = data(3) + data(4) * 256; % Need to check endian calc 
if data(5) ~= 13 || data(6) ~= 10 
    error('Not terminated correctly') 
end 

あなたのCR/LFのASCII値は正しいですか?

+0

おっと、はい、誤って、16進値の代わりにCR/LFバイトの小数点を入れました。元の投稿を編集して正しい16進数値を使用しました。それに気づいてくれてありがとう。 – David

関連する問題