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*4B24 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() 함수가 건너뛰지 못하게 막은 것입니다.
#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등록된 댓글이 없습니다.