BASIC4MCU | 질문게시판 | 답변 : 답변 : avr 에러 관련 문의드립니다.
페이지 정보
작성자 master 작성일2018-01-23 09:56 조회17,400회 댓글1건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=132
본문
#include <avr/io.h>#include <avr/interrupt.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#define null 0 // C 형 NULL 값(0)//비교 NMEA_codechar NAME[10]="$GPGGA"; //NMEA _ GPGGA//UART GPS_DATA 저장 및 피신char GPS_DATA[100]; // UART로 받은 데이터 저장char GPS_DATA1[100]; // GPGGA DATA 피신 저장// Count 및 flag 변수int GPScnt; // UART로 받은 데이터 저장 COUNTint GPScnt1; // UART COUNT 값 피신 저장int GPSflag;int i;//(,)구간 별로 저장하기 위한 포인터char*GPS_cut=null; // STRTOK 함수 사용을 위한 변수char*GPS_Dcut[15]={ null}; // GPGGA 값을(,)STRTOK 로 나누어 저장ISR(USART1_RX_vect){unsigned char RX; // UDR1 char data 저장 변수RX=UDR1; // UDR1 char 값을 RX 변수에 저장if(RX=='$'){ // GPS NMEA_code[STX]GPS_DATA[0]='$'; // GPS_DATA[0]에 '$' 저장GPScnt=1; // GPScnt=1 저장GPSflag=0; // GPSflag=0 저장}else{GPS_DATA[GPScnt]=RX; // char 형 DATA RX 를 GPS_DATA 배열에 저장if(GPS_DATA[GPScnt]==0x0a){ // 위에서 ETX=0x0A 라고 했으므로 조건을 걸어버린다.GPScnt1=GPScnt; // 조건이 성립되면 COUNT 된 값을 GPScnt1으로 피신시킨다.if(strncmp(NAME,GPS_DATA,6)==0){ // 이 부분은 NAME="$GPGGA" 비교한 것이다.memmove(GPS_DATA1,GPS_DATA,GPScnt1); // 메모리 복사GPS_cut=strtok(GPS_DATA1,","); // STRTOK 구간 나누는 함수for(i=0; GPS_cut!=null; i++){ // 나누는 조건이 0일때까지GPS_Dcut[i]=GPS_cut; // 나눈값 포인터 배열에 저장GPS_cut=strtok(null,","); // 구간(,)나누기}GPSflag=1; // flag=1}}GPScnt++;}}//void GPS_Latitude() // 위 도{unsigned char DO,BOON; // 도,분 저장 변수double CHO; // 초 저장 변수double Latitude; // GPS_LATITUDE 값 저장 변수//atol()=>LONG 변환,atoi()=>INT 변환,atof()=>DOUBLE 변환//순수 숫자나 부호로 이루어진 문자열을 해당 타입으로 변환// $GPGGA,035155.00,3723.19464,N,12656.72748,E,1,06,1.69,47.0,M,18.5,M,,*6F 출력 샘플// 위도 는 처음 도분 형태로 들어온다.우리는 구글 맵상과 비교를 위하여 도분을 도분초로 변환 한다.Latitude=atof(GPS_Dcut[2]); // 문자열을 DOUBLE 형 으로 변환후 저장=>" 3723.19464 "DO=Latitude/100; // 도 위치인 37 저장BOON=(int)Latitude%100; // 분 위치인 23 저장CHO=(Latitude-(int)Latitude)*60; // 초 를 구하기 위하여(3723.19464-3723)*60// 소숫점만 빼내어 60을 곱하면 초로 변환 된다.printf("LATITUDE:%2d'%2d`%0.02lf%s \n\r",DO,BOON,CHO,GPS_Dcut[3]); // 도,분,초,N}//void GPS_Longitude() // 경 도{unsigned char DO,BOON; // 도,분 저장 변수double CHO; // 초 저장 변수double Longitude; // GPS_LATITUDE 값 저장 변수//atol()=>LONG 변환,atoi()=>INT 변환,atof()=>DOUBLE 변환//순수 숫자나 부호로 이루어진 문자열을 해당 타입으로 변환// $GPGGA,035155.00,3723.19464,N,12656.72748,E,1,06,1.69,47.0,M,18.5,M,,*6F 출력 샘플// 경도 는 처음 도분 형태로 들어온다.우리는 구글 맵상과 비교를 위하여 도분을 도분초로 변환 한다.Longitude=atof(GPS_Dcut[4]); // 문자열을 DOUBLE 형 으로 변환후 저장=>" 12656.72748 "DO=(int)Longitude/100; // 도 위치인 126 저장BOON=((int)Longitude%100); // 분 위치인 56 저장CHO=(Longitude-(int)Longitude)*60; // 초 를 구하기 위하여(12656.72748-12656)*60printf("LONGITUDE:%3d'%02d`%0.02lf%s \n\r",DO,BOON,CHO,GPS_Dcut[5]); //도,분,초,E}//int main(void){int Position_Fix; //GPS 신호가 잡혔는지 CHECK 변수UCSR0A=0x00;UCSR0B=0x98;UCSR0C=0x06;UBRR0H=0x00;UBRR0L=103;UCSR1A=0x00;UCSR1B=0x98;UCSR1C=0x06;UBRR1H=0x00;UBRR1L=103;sei();while(1){// $GPGGA,035155.00,3723.19464,N,12656.72748,E,{ 1},06,1.69,47.0,M,18.5,M,,*6F 출력 샘플Position_Fix=atoi(GPS_Dcut[6]); // position_FIXif(!Position_Fix)printf(" Position_Fix LOADING \n\r"); // 0 LOADING,1 위성으로만 계산,2 지상 안테나에서 수신if(GPSflag==1){ // flag==1이면GPS_Latitude(); // 위도GPS_Longitude(); // 경도}}}//
댓글 1
조회수 17,400도도리님의 댓글
도도리 작성일감사합니다. 알려주신대로 해보니 잘 됩니다