2016-09-03 8 views
0

Я пытаюсь получить поток данных с платформы Arduino до Matlab. Я хочу, чтобы Matlab читал 15 байт пакетов данных, разбирал их, а затем читал следующий фрагмент.Matlab: fscanf() не останавливается при подаче строки

В настоящее время у меня есть проблема, что matlab не прекращает чтение, пока буфер не будет заполнен.

Моя установка на Matlab стороне:

s=serial('COM25','BaudRate',115200, 'Terminator', 'LF') 
fopen(s) 
data=fscanf(s) 

С аппаратной стороны:

usbMsg[0] = 0xA0; 
    usbMsg[1] = _packetCounter; 
    // ch1 
    usbMsg[2] = in[3]; 
    usbMsg[3] = in[4]; 
    usbMsg[4] = in[5]; 
    // ch2 
    usbMsg[5] = in[6]; 
    usbMsg[6] = in[7]; 
    usbMsg[7] = in[8]; 
    // ch3 
    usbMsg[8] = in[9]; 
    usbMsg[9] = in[10]; 
    usbMsg[10] = in[11]; 
    // ch4 
    usbMsg[11] = in[12]; 
    usbMsg[12] = in[13]; 
    usbMsg[13] = in[14]; 

    usbMsg[14] = '\n'; // LF 

    SerialUSB.write(usbMsg, 15); 

"usbMsg" и "в" являются массивы байтов.

Вместо того, чтобы просто возвращать одно сообщение, команда fscanf() продолжает чтение. По-видимому, он не распознает терминатор.

Я пробовал разные Терминаторы: 'LF/CR' 'CR' 'LF' и их эквивалент ASCII Без всяких успехов.

Может ли кто-нибудь увидеть, где проблема?

Заранее благодарен!

EDIT:

У меня есть дополнительный следить за вопрос о буферах. Если бы я уменьшил размер буфера последовательного порта (последовательного объекта в пределах Matlab) до 15 байт и продолжал читать эти данные, может ли это привести к потере данных?

Я не уверен, есть ли буфер в интерфейсе usb и насколько он большой.

+1

Когда вы устанавливаете терминатор, он применяется только к терминатору, прилагаемому к вашим исходящим сообщениям. 'fscanf()' всегда будет извлекать содержимое содержимого входящего буфера последовательного соединения. Я бы порекомендовал разбор его локально. –

+1

Что касается синтаксического анализа, то входящие данные, вероятно, представляют собой массив символов. Пропустить 15 байт за раз в ваш синтаксический анализатор: 'для i = 1: ceil (длина (данные)/15); если длина (данные)> 15; toparse = data (1:15); data = data (16: end); синтаксический анализ (toparse); else разбор (данные); end; ' –

+0

Эй! Отлично, большое спасибо. Теперь кажется очевидным, что вы это сказали :-). Если вы ответите комментарий как ответ, я могу отметить вопрос как ответ. :-) – Chuchaki

ответ

1

Когда вы устанавливаете терминатор, он применяется только к терминатору, прилагаемому к вашим исходящим сообщениям. fscanf() всегда будет извлекать все содержимое входящего буфера последовательного соединения. Я бы порекомендовал разбор его локально.

Что касается синтаксического анализа, то входящие данные, вероятно, представляют собой массив символов. Пропустить 15 байт за раз в ваш парсер:

for i = 1:ceil(length(data)/15) 
    if length(data) >15 
     toparse = data(1:15); 
     data = data(16:end); 
     parse(toparse); 
    else 
     parse(data); 
end 
Смежные вопросы