2016-10-23 3 views
0

Arduino에서 TinyGPS++을 사용하여 NMEA 데이터를 구문 분석하고 OLED 디스플레이에 정보를 표시하려고합니다. 그러나 소프트웨어 직렬 및 TX/RX 핀을 사용하는 대신 NMEA 데이터가 USB에 수신됩니다. ,시리얼에서 NMEA 문장을 구문 분석

1) 첫 번째 64 개 문자가 아두 이노에 의해 수신 , 내가 시리얼 모니터를 통해 하나 개의 NMEA 문장을 보내 (윈도우 :

나는 TinyGPS ++의 예를 따라,하지만 난 두 가지 문제가 발생 Arduino 1.6.9). 이 제한을 어떻게 극복 할 수 있습니까? 소수 자릿수를 삭제하면 도움이되지만이 방법을 선호하지 않습니다.

2) TinyGPS ++ BasicExample에서 샘플 NMEA 문자열이 읽기 전용 메모리에 정의되어 있습니다 : 내 NMEA를받을

while (*gpsStream) { 
    Serial.print(*gpsStream); 
    gps.encode(*gpsStream++); 
} 

에 의해

// A sample NMEA stream. 
const char *gpsStream = 
    "$GPRMC,045103.0,A,3014.0,N,09748.0,W,36.88,65.02,030913,,,A*7C\r\n" 
    "$GPGGA,045104.0,3014.0,N,09749.0,W,1,09,1.2,211.6,M,-22.5,M,,*62\r\n" 
    "$GPRMC,045200.0,A,3014.0,N,09748.0,W,36.88,65.02,030913,,,A*77\r\n" 
    "$GPGGA,045201.0,3014.0,N,09749.0,W,1,09,1.2,211.6,M,-22.5,M,,*6C\r\n" 
    "$GPRMC,045251.0,A,3014.0,N,09748.0,W,36.88,65.02,030913,,,A*7D\r\n" 
    "$GPGGA,045252.0,3014.0,N,09749.0,W,1,09,1.2,211.6,M,-22.5,M,,*6F\r\n"; 

및 분석 (불행하게도 단지 한 라인)이 방법 :

if (Serial.available()) { 
    while (Serial.available() > 0) { 
    if(index < 80) 
    { 
     inChar = Serial.read(); 
     inData[index] = inChar; 
     index++; 
     inData[index] = '\0'; 
    } 
    } 
} 

을 찾아 다음과 같이 구문 분석하십시오.

index = 0; 
while (index < 80) { 
    gps.encode(inData[index]); 
    Serial.print(inData[index]); 
    index++; 
} 

그러나 원하는대로 작동하지 않습니다. 위치 isValid()이 항상 true가 아닌지 확인합니다.

불행히도, 나는이 원치 않는 행동에 대해 여러 가지 원인이있을 수 있습니다.

  1. 너무 짧은 문장 (가능성이) 시리얼을 통해 데이터를 읽는
  2. 잘못된 방법입니다.
  3. 한 줄만 제출하십시오.
  4. 다른 것.

나는 NMEA도 직렬 데이터 통신도 경험이 없으며 Arduino/C에 대한 경험이 거의 없습니다. 이 문제를 해결하는 방법을 가르쳐 주시겠습니까?

+0

# 1은 [이 버그] (https://github.com/arduino/Arduino/issues/1223)로 인한 것 같습니다. 내 직감은 PC에서 더 부드럽게 진행된다는 것입니다. 직렬 동글을 컴퓨터에 연결하고, 거기서 초기 개발사를 수행 한 다음, arduino 특정 문제를 두 번째로 해결해보십시오. –

+0

수신 및 구문 분석 루프가 나에게도 틀린 것처럼 보이지만 [MCVE] (http://stackoverflow.com/help/mcve)가 없으면 말하기 어렵습니다 –

+0

직렬 동글의 의미를 이해하지 못합니다. 나중에 GPS 장치가 추가됩니다. 지금은 PC를 통해 Arduino에 보내는 몇 문장 만 있습니다. 나는 캐리지 리턴으로 인한 것이라고 생각하지 않습니다. 단순히 라인의 끝이 아닌 특정 위치에서 마사지를 자르기 때문입니다. 그러나 나는 그것을 살펴보고 MCVE를 제공 할 것입니다. – Markus

답변

0

기본적으로 NMEA 문자를 누적 할 필요가 없습니다. 단지 GPS 라이브러리에 피드를 보내면됩니다. 전체 루프를 제공하지는 않지만 문제가있는 것은 매우 일반적입니다.

여러 GPS 라이브러리 및 예제로 고심 끝에 결국 NeoGPS이라고 썼습니다. 다른 모든 라이브러리보다 빠르고 작으며 체크섬의 유효성을 검사하고 예제가 올바르게 구조화됩니다. 다른 라이브러리와 달리 NeoGPS는 GPS 값을 부동 소수점 값으로 저장하지 않으므로 GPS 장치의 전체 정확도를 유지할 수 있습니다.

시도해 보려면 설치 지침을 따르십시오. NMEA.ino 예제는 보내주는 GPS 문장의 각 배치에 대해 한 줄의 정보 (CSV 형식)를 내보내고 기본 RMC 문장으로 끝납니다.gps_port 대신 Serial 객체를 사용하도록 수정하거나 그런 식으로 정의해야합니다 :

#define gps_port Serial 

그것은 또한 좋은 문장 수신 얼마나 많은 구문 분석 된 문자의 수를 표시합니다, 그리고 체크섬 오류가있는 문장의 수 체크섬을 올바르게 생성하지 않으면 디버깅에 도움이 될 수 있습니다. This site도 유용합니다.

이러한 CSV 라인은 USB 포트를 통해 PC로 되돌려 보내지 만 특정 필드를 OLED로 보내도록 쉽게 변경할 수 있습니다 (NMEAloc.ino 참조).

가능하지만 PC에서 무언가를 개발 한 다음 Arduino와 같은 임베디드 환경으로 이식하려면 선형 프로그램 구조와 리소스 제한을 무시해야합니다 (프로그램 크기 , MCU 속도 및 RAM). Arduino 환경에는 PC와 "스케치 (sketch)"를 포트하는 것이 좌절감을주는 많은 단점이 있습니다.       : P

+0

안녕하세요, 고마워요! 한번 살펴 보겠습니다.하지만 시간이 좀 걸릴 수 있습니다. 나는 너를 새롭게 해 둔다. – Markus

관련 문제