✅ 목표 (Goal)

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;
}

Untitled

✅ 참조 (Ref.)