통신 > GPS 수신함수

TODAY1,453 TOTAL2,701,358
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 통신 | GPS시계 | GPS 수신함수

페이지 정보

작성자 키트 작성일2017-09-01 13:39 조회1,276회 댓글0건

본문

//
void TX1_CH(char ch)   { while(!(UCSR1A&0x20)); UDR1=ch; } // 송신 1바이트
void TX1_STR(char *str){ while(*str)TX1_CH(*str++);      } // 송신 문자열
//
interrupt [USART0_RXC] void usart0_rx_isr(void){
    unsigned char RX;
    RX=UDR0;
    //
    if(RX=='$'){ rx_buf[0]='$'; rx_cnt=1; }  
    else if(RX==0x0A){
        rx_buf[rx_cnt++]=0; //null
        if(strncmp("$GPRMC",rx_buf,6)==0){
            TX1_STR(rx_buf); TX1_CH(0x0d); TX1_CH(0x0a);
        }
        rx_cnt=0;  
    }
    else if(RX==0x0D){
        rx_buf[rx_cnt++]=0; //null
    }
    else if(RX==','){
        if(rx_buf[rx_cnt-1]==',')rx_buf[rx_cnt++]='0'; // 연속된 ','인경우 '0'을 추가함
        rx_buf[rx_cnt++]=RX;
    }
    else{
        if(rx_cnt<95)rx_buf[rx_cnt++]=RX;
    }
}
//

앞글의 수신 함수를 일부 수정해서  받은 데이터를 동시에 송신 했습니다.

수정 내용은

연속된 컴마인 경우 '0'을 채웠고

0x0d를 만나면 null(0)을 저장 했습니다.

//

$GPRMC,234517.000,V,0,0,0,0,0,0,100114,0,0,N*4E
$GPRMC,234518.000,V,0,0,0,0,0,0,100114,0,0,N*41
$GPRMC,234519.000,V,0,0,0,0,0,0,100114,0,0,N*40
$GPRMC,234520.000,V,0,0,0,0,0,0,100114,0,0,N*4A
$GPRMC,234521.000,V,0,0,0,0,0,0,100114,0,0,N*4B

24 47 50 52 4D 43 2C 32 33 34 35 32 32 2E 30 30 30 2C 56 2C 30 2C 30 2C 30 2C 30 2C 30 2C 30 2C 31 30 30 31 31 34 2C 30 2C 30 2C 4E 2A 34 38 0D 0A

24 47 50 52 4D 43 2C 32 33 34 35 32 33 2E 30 30 30 2C 56 2C 30 2C 30 2C 30 2C 30 2C 30 2C 30 2C 31 30 30 31 31 34 2C 30 2C 30 2C 4E 2A 34 39 0D 0A

24 47 50 52 4D 43 2C 32 33 34 35 32 34 2E 30 30 30 2C 56 2C 30 2C 30 2C 30 2C 30 2C 30 2C 30 2C 31 30 30 31 31 34 2C 30 2C 30 2C 4E 2A 34 45 0D 0A

24 47 50 52 4D 43 2C 32 33 34 35 32 35 2E 30 30 30 2C 56 2C 30 2C 30 2C 30 2C 30 2C 30 2C 30 2C 31 30 30 31 31 34 2C 30 2C 30 2C 4E 2A 34 46 0D 0A

24 47 50 52 4D 43 2C 32 33 34 35 32 36 2E 30 30 30 2C 56 2C 30 2C 30 2C 30 2C 30 2C 30 2C 30 2C 31 30 30 31 31 34 2C 30 2C 30 2C 4E 2A 34 43 0D 0A

24 47 50 52 4D 43 2C 32 33 34 35 32 37 2E 30 30 30 2C 56 2C 30 2C 30 2C 30 2C 30 2C 30 2C 30 2C 31 30 30 31 31 34 2C 30 2C 30 2C 4E 2A 34 44 0D 0A

 

115200 속도라서 4.3ms 정도밖에 안걸립니다.

지금 데이터는 위성을 잡지 못한 상태이고..위성을 잡으면 데이터가 늘어나니 좀 더 걸리겠죠..^^

 

//

위성을 잡지 못한 상태에서 신호가 누락되면

,,, 연속된 컴마로 데이터가 들어오게 되고

strtok() 함수를 사용해서 자를 때에도 데이터가 없으면 건너뛰는 문제가 있어서

연속된 컴마인 경우 가짜(?)데이터를 넣어줘서

strtok() 함수가 건너뛰지 못하게 막은 것입니다.

 

3660040649_ACdxkDzH_GPS-7.PNG3Ftype3Dw740

 

 

#include
#include
//
char rx_data[100]="$GPRMC,234517.000,V,0,0,0,0,0,0,100114,0,0,N*4E";
char GPS_DATA[100];
char *GPS_cut=0; 
char *GPS_Dcut[16]={0}; 
//
int main(void){
 int i;
 while(1){
        if(strncmp("$GPRMC",rx_data,6)==0){
            memmove(GPS_DATA,rx_data,strlen(rx_data));
            GPS_cut=strtok(GPS_DATA,",");                
            for(i=0;GPS_cut!=0;i++){ 
    GPS_Dcut[i]=GPS_cut; 
    GPS_cut=strtok(0,","); 
   } 
        }
 }
} 

 

코드비젼으로 받은 데이터를 새로 넣어서 다시 시뮬레이션한 예제소스와 사진입니다.

댓글 0

조회수 1,276

등록된 댓글이 없습니다.

통신HOME > 통신 > GPS시계 목록

게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기