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