2012-03-14 2 views
2

Arduino 보드에서 시리얼 라인을 통해 들어오는 데이터 스트림이 있습니다. 스트림은 다음과 같습니다.'fscanf'를 사용하여 MATLAB의 시리얼 라인에서 데이터를 읽을 때 제로 해석

0x43 0x03 0x39 0x00 0x0D 0x0A 

처음 두 바이트 (0x43 및 0x03)는 1 바이트 정수 값입니다. 다음 2 바이트 (0x39 및 0x00)는 단일 16 비트 리틀 엔디안 부호있는 정수 값입니다. 마지막 두 바이트 (0x10 및 0x13)는 종결 자 시퀀스 ("\ r \ n")로 간주됩니다.

이 데이터를 읽으려면 MATLAB을 사용하고 있습니다. 나는 직렬 연결을 만들고, 열고, 데이터를 읽는다. 불행하게도, 0x30을 바이트 값으로 사용할 때 문제가 발생합니다. fscanf은 단순히 문자열의 널 종결 자로 간주하기 때문입니다. 불행하게도

%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 

이다 "integerByteChars"어떻게 나는 그것이 싶습니다 같은 두 요소의 배열이 아니라 단지 오히려 1 요소의 배열 때문에 fscanf 무엇 : 여기

은 몇 가지 예제 코드입니다 0x00을 널 종단 문자열 값으로 간주합니다. 그러나 이것은 '% s'가 아닌 '% c'를 사용하여 데이터를 입력하기 때문에 놀라운 일입니다.

내가 필요로하는 것은 0 바이트 일지라도 버려 두지 않고이 바이트를 데이터로 읽는 함수입니다. 그 기능을 사용할 수있는 기능은 무엇입니까? 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

관련 문제