📄 gps_module.lst
字号:
533 3
534 3 // *gps_speed=(uint)mid_speed; /*把ulong型强制转换为uint型,输出*/
535 3
536 3 }
537 2
538 2 return GPS_OK;
539 2 }
540 1 else
541 1 {
542 2 return GPS_ERROR;
543 2 }
544 1 }
545
546
547 /********************************************************************************
548 *
C51 COMPILER V8.02 GPS_MODULE 09/25/2008 19:29:39 PAGE 10
549 * 函数功能:取出GPS字符串中指定位置的一个逗号与下一个逗号间的子串(GPS_SUB_STR)
550 * 输入 :GPS字符串数据
551 * 输出 :指定位置的逗号与下一个逗号之间的子串
552 * 数据包 :所有类型的包格式
553 *
554 ********************************************************************************/
555
556 /*修改"找第几个数据的函数" 2006-4-3 24:20*/
557
558 int get_sub_str(uchar *gps_buff, int first_comma, uchar *gps_sub_str)
559 {
560 1 uchar i=0;
561 1 int comma_currrent=0;
562 1
563 1 if((*gps_buff=='$')&&(first_comma>0))
564 1 {
565 2 while(i<GPS_DATA_MAXLEN)
566 2 {
567 3 i++;
568 3 gps_buff+=1;
569 3
570 3 if(','==*gps_buff) /*数逗号*/
571 3 {
572 4 comma_currrent+=1;
573 4 }
574 3
575 3 if(first_comma==comma_currrent) /*当找到要找的第几个逗号后,也就找到了要找的数据*/
576 3 {
577 4 gps_buff+=1;
578 4
579 4 while(','!=*gps_buff) /*在遇到下一个逗号之前的数据,即是要找的数据*/
580 4 {
581 5 *gps_sub_str=*gps_buff;
582 5
583 5 gps_sub_str++;
584 5
585 5 gps_buff++;
586 5 }
587 4
588 4 *gps_sub_str='\0';/*接收完要接收的数据(经度或纬度等)后,赋值零,表示接收完毕*/
589 4
590 4 break; /*加break,使找到所要的数据后跳出循环 2006-4-4 11:04*/
591 4 }
592 3 }
593 2
594 2 return GPS_OK;
595 2 }
596 1 else
597 1 {
598 2 return GPS_ERROR;
599 2 }
600 1 }
601
602 /********************************************************************************
603 *
604 * 函数功能:当收到GPS数据包时,调用gps_mod()函数
605 *
606 ********************************************************************************/
607 char gps_process(void)
608 {
609 1 static char data init=0;
610 1 unsigned int tmp;
C51 COMPILER V8.02 GPS_MODULE 09/25/2008 19:29:39 PAGE 11
611 1 char *gpsPtr;
612 1 int i=0;
613 1 if(gps_receive_flg==0) return 0;
614 1 if( !init )
615 1 {
616 2 memset(&gps_struct, 0, sizeof(gps_struct));
617 2 init = 1;
618 2 uart1_init();
619 2 }
620 1
621 1
622 1 tmp = get_gps_packet(&gpsPtr); /*得到缓冲区中一整串字符的长度*/
623 1
624 1 if( tmp )
625 1 {
626 2 gps_struct.valid = 0;
627 2
628 2 *(gpsPtr+tmp) = 0; /*当缓冲区中的一整串数据接收完毕时,加零表示接收结束*/
629 2 while(*gpsPtr!=0x00) /*一直循环,直到遇到0*/
630 2 {
631 3 if (*gpsPtr=='$') /*如果找到'$',继续后移,并给gps_buff[0]赋以'$'*/
632 3 {
633 4 gpsPtr+=1;
634 4
635 4 gGps_buff[0]='$';
636 4
637 4 i+=1;
638 4
639 4 while (*gpsPtr!='$'&& (i<GPS_DATA_MAXLEN))/*在遇到下一个'$'符号之前,一直填充 gps_buff[i]*
-/
640 4 {
641 5 gGps_buff[i]=*gpsPtr;
642 5
643 5 i++;
644 5
645 5 gpsPtr++;
646 5
647 5 }
648 4
649 4 if(GPS_ERROR==gps_mod(gGps_buff))/*调用此函数,对收到的一小串数据进行处理*/
650 4 {
651 5 return(0);
652 5 }
653 4 i=0;
654 4 }
655 3
656 3 else
657 3 {
658 4 gpsPtr++;/*如果未找到'$',一直找'$'*/
659 4 }
660 3 }
661 2 enable_rcv_gps();/*接收完一整串数据后,对串口进行清零*/
662 2 }
663 1
664 1 return(tmp);
665 1 }
666
667 /********************************************************************************
668 *
669 * 函数功能:调用以上所有函数,并填充结构体GPS_DATA
670 *
671 ********************************************************************************/
C51 COMPILER V8.02 GPS_MODULE 09/25/2008 19:29:39 PAGE 12
672 extern unsigned char gps_str[80];
673 int gps_mod(uchar *gps_buff)
674 {
675 1 uint tmp_alti_spe_dir=0;
676 1 if(GPS_OK==gps_chk(gps_buff)) /*如果校验和正确*/
677 1 {
678 2 if(get_format(gps_buff)==GPRMC) /*判断出某种协议格式*/
679 2 {
680 3 get_gps_state(gps_buff, &(gps_string.valid));
681 3 if(gps_string.valid!='A')
682 3 return GPS_ERROR;
683 3 memset(gps_str,0,80);
684 3 if(station_key==1)
685 3 {
686 4 station_key=0;
687 4 memcpy(gps_str+2,gps_buff,strlen(gps_buff));
688 4 if(cur_direction==24)
689 4 {
690 5 gps_str[0]=(gps_8line[cur_line].station_counter_up+1)/10+'0';
691 5 gps_str[1]=(gps_8line[cur_line].station_counter_up+1)%10+'0';
692 5 gps_8line[cur_line].station_counter_up++;
693 5 gps_8line[cur_line].gps_counter_up++;
694 5 }
695 4 else if(cur_direction==25)
696 4 {
697 5 gps_str[0]=(gps_8line[cur_line].station_counter_down+1)/10+'0';
698 5 gps_str[1]=(gps_8line[cur_line].station_counter_down+1)%10+'0';
699 5 gps_8line[cur_line].station_counter_down++;
700 5 gps_8line[cur_line].gps_counter_down++;
701 5 }
702 4 //保存数据和结构体
703 4
704 4 //
705 4 }
706 3 else if(corner_key==1)
707 3 {
708 4 corner_key=0;
709 4 gps_str[0]='9';
710 4 gps_str[1]='9';
711 4 memcpy(gps_str+2,gps_buff,strlen(gps_buff));
712 4 if(cur_direction==24)
713 4 {
714 5 gps_8line[cur_line].corner_counter_up++;
715 5 gps_8line[cur_line].gps_counter_up++;
716 5 }
717 4 else if(cur_direction==25)
718 4 {
719 5 gps_8line[cur_line].corner_counter_down++;
720 5 gps_8line[cur_line].gps_counter_down++;
721 5 }
722 4 //保存数据和结构体
723 4
724 4 //
725 4 }
726 3 else
727 3 {
728 4 memcpy(gps_str,gps_buff,strlen(gps_buff));
729 4 if(cur_direction==24)
730 4 {
731 5 gps_8line[cur_line].gps_counter_up++;
732 5 }
733 4 else if(cur_direction==25)
C51 COMPILER V8.02 GPS_MODULE 09/25/2008 19:29:39 PAGE 13
734 4 {
735 5 gps_8line[cur_line].gps_counter_down++;
736 5 }
737 4 //保存数据和结构体
738 4
739 4 //
740 4 }
741 3 savegpstoflash();
742 3
743 3
744 3 get_sub_str(gps_buff, 3, gps_string.latitude); /*得到纬度*/
745 3 get_sub_str(gps_buff, 5, gps_string.longitude); /*得到经度*/
746 3 tmp_alti_spe_dir=0; /*高度、速度、方向共用一个变量,用后清零*/
-
747 3 get_speed(gps_buff, &tmp_alti_spe_dir); /*得到速度*/
748 3 gps_string.speed[0]=(tmp_alti_spe_dir*18)/1000/10+'0';
749 3 gps_string.speed[1]=(tmp_alti_spe_dir*18)/1000%10+'0';
750 3 gps_string.speed[2]=0;
751 3 gps_string.valid='A';
752 3
753 3 return GPS_OK;
754 3 }
755 2 gps_string.valid='V';
756 2 return GPS_ERROR;
757 2 }
758 1 else
759 1 {
760 2 gps_string.valid='V';
761 2 return GPS_ERROR;
762 2 }
763 1 }
764
765 /********************************************************************************
766 *
767 * 函数功能:将结构体所有成员置零
768 *
769 ********************************************************************************/
770
771
772
773 void get_gps_data(GPS_DATA **ptr)
774 {
775 1 if( gps_struct.valid == 0x41 )
776 1 gps_struct.valid = 0x41;
777 1 else
778 1 gps_struct.valid = 0;
779 1
780 1 *ptr = &gps_struct;
781 1 }
782
783
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 3372 ----
CONSTANT SIZE = 42 ----
XDATA SIZE = 129 196
PDATA SIZE = ---- ----
DATA SIZE = 1 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILER V8.02 GPS_MODULE 09/25/2008 19:29:39 PAGE 14
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -