NMEA와 유사한 포맷에서 NMEA 한문장을 뽑기
#define _CRT_SECURE_NO_WARNINGS // strtok 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
#include <string.h> // for strtok()
#define UART_SOF 0x24 // '$'
#define UART_EOF 0x2A // '*'
void parse(char* str) {
char* delimiter;
char dummy_cnt = 0;
printf("parse() : %s\\n", str);
delimiter = strtok(str, ","); // " " 공백 문자를 기준으로 문자열을 자름, 포인터 반환
while (delimiter != NULL) { // 자른 문자열이 나오지 않을 때까지 반복
//printf("[%d] %s\\n", dummy_cnt++, delimiter); // 자른 문자열 출력
delimiter = strtok(NULL, ","); // 다음 문자열을 잘라서 포인터를 반환
}
}
// str에 value가 포함되어 있다면 1, 없으면 0
char contains(char* str, char* value) {
}
int main() {
char uart_rx_buffer[128] = "AA,BB,CC,88,*$,1B3,0,0,8,12,34,33,44,55,66,77,88,*$,AAA,0,0";
char sentence[64] = { 0, };
char* sof_ch = strchr(uart_rx_buffer, UART_SOF); // $로 시작하는 문자열을 찾음
char* eof_ch = strrchr(uart_rx_buffer, UART_EOF); // *로 끝나는 문자열을 찾음
char end_pos = 0;
printf("%s\\r\\n", &uart_rx_buffer);
printf("strchr() : '$' pos is "); if (sof_ch) { printf("'%c' %d\\n", *sof_ch, sof_ch - uart_rx_buffer); } // 13
printf("strrchr() : '*' pos is "); if (eof_ch) { printf("%d\\n", eof_ch - uart_rx_buffer); } // 49
if (strchr(uart_rx_buffer, ',') != NULL) {
end_pos = ((eof_ch - uart_rx_buffer) - (sof_ch - uart_rx_buffer)) + 1;
//strncpy(sentence, sof_ch, eof_ch-uart_rx_buffer);
strncpy(sentence, sof_ch, 37);
sentence[37 + 1] = '\\0';
printf("end_pos is %d\\n", end_pos);
printf("sentence is %s\\n", sentence); // 검색된 문자열 출력
end_pos = 0;
/*
if(eof_ch-uart_rx_buffer>=30) {
parse(sentence);
}
*/
sof_ch = strchr(sof_ch + 1, UART_SOF); // 포인터에 1을 더하여 a 다음부터 검색
}
return 0;
}
▼