Интерпретация нуля при чтении данных из последовательной линии в MATLAB с использованием 'fscanf' - PullRequest
2 голосов
/ 14 марта 2012

У меня есть поток данных, поступающий по последовательной линии от платы Arduino.Поток выглядит так:

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

Первые два байта (0x43 и 0x03) являются однобайтовыми целочисленными значениями.Следующие два байта (0x39 и 0x00) представляют собой одно 16-разрядное целочисленное значение со знаком с прямым порядком байтов.Предполагается, что последние два байта (0x10 и 0x13) являются последовательностью терминатора ("\ r \ n").

Я использую MATLAB для чтения этих данных.Я создаю последовательное соединение, открываю его и читаю данные.К сожалению, я сталкиваюсь с проблемами при использовании 0x00 в качестве значения байта, потому что 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" - это не 2-элементный массив, как мне бы хотелось, а 1-элементныймассив, потому что fscanf просто считает 0x00 строковым значением с нулевым символом в конце.Это удивляет меня, однако, потому что я вводю данные, используя «% c», а не «% s» (который используется для строк).

Мне нужна функция, которая будет считывать эти байты как данные, даже если это нулевой байт, а не выбрасывать их.Какие функции доступны для меня, что будет делать это?Можно ли заставить fscanf сделать это?

1 Ответ

2 голосов
/ 14 марта 2012

fread был бы хорошим способом сделать это.

Вы можете прочитать все 6 байтов с помощью:

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

и затем обработать возвращаемый вектор.

 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 правильные?

...