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가 아닌지 확인합니다.
불행히도, 나는이 원치 않는 행동에 대해 여러 가지 원인이있을 수 있습니다.
- 너무 짧은 문장 (가능성이) 시리얼을 통해 데이터를 읽는
- 잘못된 방법입니다.
- 한 줄만 제출하십시오.
- 다른 것.
나는 NMEA도 직렬 데이터 통신도 경험이 없으며 Arduino/C에 대한 경험이 거의 없습니다. 이 문제를 해결하는 방법을 가르쳐 주시겠습니까?
# 1은 [이 버그] (https://github.com/arduino/Arduino/issues/1223)로 인한 것 같습니다. 내 직감은 PC에서 더 부드럽게 진행된다는 것입니다. 직렬 동글을 컴퓨터에 연결하고, 거기서 초기 개발사를 수행 한 다음, arduino 특정 문제를 두 번째로 해결해보십시오. –
수신 및 구문 분석 루프가 나에게도 틀린 것처럼 보이지만 [MCVE] (http://stackoverflow.com/help/mcve)가 없으면 말하기 어렵습니다 –
직렬 동글의 의미를 이해하지 못합니다. 나중에 GPS 장치가 추가됩니다. 지금은 PC를 통해 Arduino에 보내는 몇 문장 만 있습니다. 나는 캐리지 리턴으로 인한 것이라고 생각하지 않습니다. 단순히 라인의 끝이 아닌 특정 위치에서 마사지를 자르기 때문입니다. 그러나 나는 그것을 살펴보고 MCVE를 제공 할 것입니다. – Markus