2014-12-23 6 views
1

Я читаю данные NMEA с входа usb от Intel Edison. Все работает нормально, за исключением одной проблемы. Если я отсоединяю кабель RS232 к USB от двух других кабелей, которые приводят к разъему переборки, я получаю поток символов, отправленных в программное обеспечение. Они кажутся большим повторением последнего символа, отправленного до того, как кабель был отключен. Я предполагаю, что это от какого-то вмешательства, введенного на 10 дюймов или около того открытого кабеля. Я хотел бы написать некоторый код, чтобы программное обеспечение могло восстанавливаться, но, как есть, мне нужно задействовать цикл. Убивать и перезапускать программное обеспечение не работает. Я попытался просто прочитать и сбросить все персонажи, пока я не получу действительную пару, но это не сработает. Вот что я пробовал:Есть ли способ сбросить или очистить ttyusb0, считая, что не горит питание компьютера

while(1){ 
    while (new_nmea_read_sentence == 0){ 
     while(read(tty_fd, &aa, 1) == -1); // read 1 character from stream (blocking call) 
     if(aa != '\n') { 
      local_buffer[idx++] = aa; 
      if(idx > 400){ 
       idx = 0;// prevent segmentation faults 
       printf("\nlocal_buffer overflow in read nmea.\n"); 
       int flag = 1; 
       char old = 'x'; 
       while (flag == 1){ 
        read(tty_fd, &aa, 1); 
        if (aa == '\n' && old == '\r') flag = 0; 
        //printf("<%c>",aa); 
        old = aa; 
       } 
      } 
     } 
     else{// deal with valid nmea sentence 

Этот поток представляет собой непрерывную петлю, считывающую данные. Другие темы касаются этого, и они передают летучий флаг назад и четвертый. Когда эта проблема возникает, первое, что я вижу, это переполнение, и я ловушку, что в коде if (idx> 400). Без этого я получаю ошибку сегментации. Код ниже while (флаг == 1) ищет, который я получил бы, если бы получил какие-либо действительные данные. Если вход представляет собой бесконечную строку символов, я продолжаю получать символы даже после повторного подключения кабеля. При перезапуске программного обеспечения нет ввода.

Мое единственное решение состоит в том, чтобы рассказать пользователю, чтобы привести в действие цикл коробки. Не очень хорошо.

+0

я все еще был бы заинтересован в пути, чтобы очистить порт с помощью программного обеспечения. То, что я закончил, было 1) Переход от внешнего кабеля к кабелю внутри коробки, чтобы его нельзя было отключить. 2) Используйте металлический ящик и добавьте фильтр к моему двигателю, чтобы удержать шум двигателя от этой проблемы. 3) Если порт замораживается, я открываю соединение на другом порту. Но с первыми двумя решениями порт не замерзает, поэтому эта последняя часть не нужна. Я никогда не нашел способ сбросить порт в программном обеспечении после его замораживания. –

ответ

0

Существует нулевой обработки ошибок в этой строке:

while(read(tty_fd, &aa, 1) == -1); // read 1 character from stream (blocking call) 

Этот код прочитал последний символ во всех случаях ошибки, поскольку возвращаемое значение read() будет отличаться от -1 и никогда не проверяется иначе. Вышеприведенный код воспримет его как успешное чтение, но aa просто сохранит свое старое значение.

Ядерный кабель USB-to-serial вызывает read() для возврата некоторого кода ошибки, такого как EIO или EBADF.

+0

Что ты предлагаешь мне делать? Я должен был сказать, что я пытался закрыть соединение и снова открыть его, но он все еще не очищается и позволяет читать, когда данные возвращаются. В конце кода есть ошибка проверки кода, в котором любые прочитанные предложения проверяют свою контрольную сумму. –

0

Что вы предлагаете мне? Я должен был сказать, что я попытался закрыть соединение и снова открыть его, но он все еще не очищается и позволяет читать , когда данные возвращаются. В конце кода кода ошибки есть ошибки, в которых проверены контрольные суммы.

Вы должны обрабатывать ошибки там, где они происходят, а не в какой-то более поздний момент, когда вы уже обработали неправильные (то есть несуществующие) данные. Изменение по крайней мере

    read(tty_fd, &aa, 1); 

в

 while (read(tty_fd, &aa, 1) < 1) /* perhaps sleep(awhile) */; 
+0

Спасибо за ответ, но я не читал (tty_fd, & aa, 1) ;.У меня было (читать (tty_fd, & aa, 1) == -1); который, я думаю, похож на то, что вы предлагаете. В любом случае, я просто не использую кабель и не отключаю его, поэтому проблема никогда не возникает. Я никогда не нашел способ сбросить порт в программном обеспечении, и это был вопрос. –

+0

@ Аллен Эдвардс - Вы не читали (tty_fd, & aa, 1); _? Посмотрите на двенадцатую строку кода, который вы опубликовали. – Armali