2014-12-23 3 views
1

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) 

이 코드는 모든 오류의 경우 마지막 문자를 읽고 :

+0

적어도

 read(tty_fd, &aa, 1); 

변경 난 아직도 소프트웨어 포트를 취소 할 수있는 방법에 관심이있을 것입니다. 내가 끝내었던 것은 1) 외부 케이블에서 상자 안의 케이블로 바뀌어서 플러그를 뽑을 수 없었다. 2) 금속 상자를 사용하고 내 엔진에 필터를 추가하여 엔진 소음이이 같은 문제를 일으키지 않도록하십시오. 3) 포트가 멈 추면 다른 포트에서 연결을 엽니 다. 그러나 처음 두 가지 솔루션을 사용하면 포트가 동결되지 않으므로이 마지막 부분은 필요하지 않습니다. 일단 고정되면 소프트웨어에서 포트를 재설정하는 방법을 찾지 못했습니다. –

답변

0

이 줄을 처리 제로 오류가 있습니다. 위의 코드는 성공적으로 읽은 것으로 간주하지만 aa은 이전 값을 그대로 유지합니다.

USB 직렬 케이블을 꽂으면 read()이 EIO 또는 EBADF와 같은 오류 코드를 반환합니다.

+0

내가 뭐라고 제안하나요? 내가 연결을 닫고 다시 열려고했지만 데이터가 반환 될 때 여전히 읽기를 허용하지 않는 것이 좋습니다. 읽은 문장의 체크섬을 확인한 코드에서 나중에 오류를 검사합니다. –

0

내가 무엇을 제안합니까? 나는 연결을 닫고 다시 열어 보았어야한다고 말했지만, 여전히 데이터가 반환 될 때 이 읽는 것을 지우거나 허용하지 않습니다. 나중에 코드에서 오류 검사가 수행되며 읽은 문장의 체크섬이 확인됩니다.

오류가 발생한 위치를 처리해야합니다. 잘못된 (즉, 존재하지 않는) 데이터를 처리 한 이후 시점이 아닙니다.

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

답장을 보내 주셔서 감사합니다. 그러나 읽지 않았습니다 (tty_fd, & aa, 1) ;.나는 가지고 있었다 (읽기 (tty_fd, & aa, 1) == -1); 나는 당신이 제안하고있는 것과 비슷하다고 생각합니다. 어쨌든, 나는 케이블을 사용하지 않고 더 이상 플러그를 뽑지 않으므로 문제가 발생하지 않습니다. 소프트웨어에서 포트를 재설정하는 방법을 찾지 못했습니다. –

+0

@Allen Edwards - 읽지 않았습니다 (tty_fd, & aa, 1); _? 게시 한 코드의 12 번째 줄을보십시오. – Armali