Intel 에디슨의 USB 입력에서 NMEA 데이터를 읽습니다. 한 가지 문제를 제외하고는 모두 잘 작동합니다. 벌크 헤드 커넥터로 연결되는 다른 두 개의 케이블에서 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
이 스레드는 데이터를 읽는 영원한 루프입니다. 다른 스레드는이를 처리하고 휘발성 플래그를 1 ~ 4로 전달합니다. 이 문제가 발생하면 내가 보는 첫 번째 일은 오버플로이며 코드에서 (idx> 400)이를 잡아냅니다. 그것 없이는 세분화 오류가 발생합니다. 아래의 코드 (flag == 1)는 유효한 데이터가 있으면 얻을 수있는 것을 찾고 있습니다. 입력이 끝없는 문자 스트링이라면 케이블을 다시 연결 한 후에도 문자를 계속 입력합니다. 소프트웨어를 다시 시작하면 입력이 발생하지 않습니다.
유일한 해결책은 상자 전원을 다시 켭니다. 별로 좋지 않습니다. read()
의 반환 값이 -1
다를 것이고, 그렇지 않으면 확인하지 않기 때문에
while(read(tty_fd, &aa, 1) == -1); // read 1 character from stream (blocking call)
이 코드는 모든 오류의 경우 마지막 문자를 읽고 :
적어도
변경 난 아직도 소프트웨어 포트를 취소 할 수있는 방법에 관심이있을 것입니다. 내가 끝내었던 것은 1) 외부 케이블에서 상자 안의 케이블로 바뀌어서 플러그를 뽑을 수 없었다. 2) 금속 상자를 사용하고 내 엔진에 필터를 추가하여 엔진 소음이이 같은 문제를 일으키지 않도록하십시오. 3) 포트가 멈 추면 다른 포트에서 연결을 엽니 다. 그러나 처음 두 가지 솔루션을 사용하면 포트가 동결되지 않으므로이 마지막 부분은 필요하지 않습니다. 일단 고정되면 소프트웨어에서 포트를 재설정하는 방법을 찾지 못했습니다. –