У меня есть поток данных, поступающий по последовательной линии от платы 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 сделать это?