큰 숫자로 문자열을 작성 (연결)하는 방법

arduino를 처음 사용합니다. 상당히 n00b 문제처럼 들리는 문제로 어려움을 겪고 있습니다. adafruit GPS- 보드를 Arduino에 연결하고 Serial.print(GPS.latitude, DEC)

를 사용하여 GPS 데이터를 직렬 포트에 뱉어 내면서 작동합니다.

이제 문자열을 연결하고 싶습니다. 처리 할 수 있습니다 (읽기 : 이더넷 클라이언트를 통해 전송하고 싶습니다.) 이것은 이미받은 것입니다.

...... String vnnt = "$VNNT,"; if (GPS.fix) { vnnt += "GPS,"; //this works: vnnt.concat(GPS.fix); //but this not: vnnt.concat(GPS.latitude); }else{ vnnt += "INFO,Acquiring Sats"; } Serial.println(vnnt); 

오류 메시지 : Call of overloaded "concat(float&)" is ambiguous Serial.print(GPS.latitude, DEC) 결과 : 4418.5937996050

그래서 아마도 크거나 뭔가 …

어떻게 변수를 연결하고 긴 문자열을 만들 수 있습니까?

댓글

  • Aren ' 세미콜론이 누락되지 않았나요?
  • 하나는 vnnt이고 다른 하나는 vannut
  • 오타가 있습니다. ' s 🙂
  • GPS.latitude의 데이터 유형을 알고 있습니까? 예 : float, int 등인가요?
  • 제 생각에 ' 플로트? 오류 메시지에 부동이라고 표시됩니다. 어떻게 알 수 있습니까? var_dump 등이 있습니까?

Answer

concat 함수는 부동 버전을 구현하지 않지만 일부 of char, int, unsigneds …

unsigned char String::concat(long unsigned int) unsigned char String::concat(unsigned int) unsigned char String::concat(int) ... 

그래서 컴파일러는 정수로 캐스트하는 방법을 알지 못합니다. 옵션.

먼저 float를 문자열로 변환하고 dtostrf () 또는 sprintf ()를 사용한 다음 문자열에 연결해야합니다.

char outstr[25]; sprintf(outstr, "%f", GPS.latitude); 

또는

dtostrf(GPS.latitude, 6, 2, outstr); //check docs for 6, 2 values, and set them for your needs 

그리고 :

vnnt.concat(outstr) 

또한 sprintf는 (char) 문자열의 압축 생성 :

char msg[80]; sprintf(msg, "$VNNT,GPS, %s %f", GPS.fix, GPS.latitude); 

Comments

  • 의심스러운 경우 +1, sprintf 출력 🙂
  • 하지만 한 가지주의 할 점 : sprintf()는 복잡한 함수이므로 오히려 느리고 상당한 메모리를 사용합니다. 일반적으로 " 프로덕션 " 코드에는 사용하지 않습니다 (디버그 목적으로 만 유지).
  • 즉, @jfpoilpret의 좋은 점, 나는 고려하지 않았습니다. dtostrf + concat 버전에 비해 효율성이 어느 정도 있습니까? sscanf ()에도 동일하게 적용됩니까? (btw, 이제 sscanf ()가 실제로 arduino에서 제대로 작동하는지 의심됩니다.)
  • 두 호출을 비교하기 위해 실제 측정을 수행하지 않았지만 C 코드를 살펴보고 아마도 확인할 수 있다고 생각합니다. 생성 된 어셈블리. sscanf, IIRC와 관련하여 몇 가지 제한 사항이 있습니다 (내 생각에 부동 소수점 숫자 포함).

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다