2017-03-19 2 views
0

내 학교 프로젝트의 경우 gps 모듈을 programm해야합니다. 이 모듈은 UART를 통해 ASCII 코드를 보내고 이미 큰 문자열 하나를 가지고 있습니다. 는 GPS 모듈은 매우 큰 메시지를 보내지 만, 난 단지 한 부분이 필요합니다시작 부분과 끝 부분이 C로 작성된 부분 문자열 만들기

$GPGSA,A,1,,,,,,,,,,,,,,,*1E 
$GPGLL,4841.9388,N,01600.3418,E,000016.015,V,N*48 
$GPZDA,000016.015,22,08,1999,,*55 
$GPGSV,1,1,01,28,-90,000,33*66 
$PERDCR,11,0,0,0.00,0.00,0.00,0.00,0.0,0,0,0.0,0,0,255,0,F,999*43 
$PERDCR,1,32540,0,817,16,0,52,0,91,0,0,0,33,0x00,*41 
$GPRMC,000017.015,V,4841.9388,N,01600.3418,E,0.00,0.00,220899,,,N*76 
**$GPGGA,000017.015,4841.9388,N,01600.3418,E,0,00,0.0,277.9,M,0.0,M,,*6E** <-this part 

굵은 부분은 어느 곳이 패키지가 될 수 있습니다. 패키지를 저장했습니다

char data[507]; 

$ GPGGA - * 6E의 데이터는 어떻게 얻을 수 있습니까? 참고 : 데이터가 변경되고 GPGGA-Package의 위치가 변경됩니다. "$ GPGGA"와 GPGGA 메시지의 길이 (이 경우)는 변경되지 않는 유일한 두 매개 변수입니다. 70

+0

코드를 강조 표시 할 수 없습니다. 그래서, 너는 무엇을 시도 했는가? 왜 작동하지 않는거야? 죄송 합니다만, 귀하의 질문에 "gimme teh codez"사이트가 아닙니다. – Olaf

+0

'ptr = strstr (data, "$ GPGGA,");'를 사용하여''$ GPGGA '에 대한 포인터를 찾을 수는 있지만''char data [507];에 더 큰 버퍼를 할당하십시오. 아마 현재 크기의 두 배입니다. –

+0

'strlen'을 사용하여 문자열의 길이를 확인하고'strstr'을 사용하여 문자열이 ** $ GPGGA **로 시작하는지 확인하십시오. –

답변

-1

문자열의 첫 번째 항목을 찾으려면 strstr을 사용할 수 있습니다. strstr을 사용하여 끝을 찾을 수도 있지만 길이가 항상 70임을 알기 때문에 검색 할 필요가 없습니다.

// Proof of concept (uncompiled) 
char* start = strstr(data, "$GPGGA"); 
strncpy(message, start, 70); 

참조 : strncpy/strncpy_s

+1

"증명"은 어떻게 테스트 될 수 있습니까? 그리고'strncpy_s'는 비표준 함수입니다. –

+0

개념 증명은 아이디어에 관한 것이지 작동하는지의 여부가 아닙니다. 내가 오타를 만들었거나, 비표준 함수를 사용했다는 것을 대비하여이 주석을 추가했습니다. – joell

0

감사 joell! strncpy 함수에 대해 thougt을 사용하지 않았습니다. 내가 처음에 시도한 것은 "$"의 위치를 ​​얻었고 그 다음 위치 + 1 = "G", 위치 + 2 = "P"등등 (if의 경우)이었습니다. ISR과 BAUD-Rate = 9600으로 작업하고 있기 때문에 제대로 작동하지 않을 것이라는 것을 알았 기 때문에 코드가 자주 변경 될 수 있습니다.

모든 답변을 주셔서 대단히 감사합니다. 특히 Mister joell! 참고 : 시작 형식은 int 여야합니다 (위치는 정수 값)

관련 문제