guxingganyue 发表于 2011-2-20 15:51:14

新年第一帖,,请给位大哥说说怎么接收一串字符呢,谢谢

我想接收一固定的字符串,用串口接收,,单片机用ATmega48,请各位大哥指点一下

这是数据:
$GPGGA,021718.000,3903.5118,N,11707.3802,E,2,07,1.5,-0.5,M,-3.1,M,3.8,0000*4E
$GPGSA,A,3,28,10,05,20,23,13,17,,,,,,2.1,1.5,1.5*38
$GPGSV,3,1,11,04,69,324,,17,56,117,34,10,51,199,45,02,40,279,*7F
$GPGSV,3,2,11,12,29,305,,23,22,073,27,13,21,109,37,20,16,045,25*78
$GPGSV,3,3,11,05,08,214,33,28,07,174,32,42,38,146,37*47
$GPRMC,021718.000,A,3903.5118,N,11707.3802,E,0.00,,220111,,,D*74
$GPVTG,,T,,M,0.00,N,0.0,K,D*16
$GPGGA,021719.000,3903.5118,N,11707.3802,E,2,06,2.1,-0.5,M,-3.1,M,1.8,0000*4B
$GPRMC,021719.000,A,3903.5118,N,11707.3802,E,0.00,,220111,,,D*75
$GPVTG,,T,,M,0.00,N,0.0,K,D*16

$GPGGA,021720.000,3903.5118,N,11707.3802,E,2,07,1.2,-0.5,M,-3.1,M,1.8,0000*40
$GPRMC,021720.000,A,3903.5118,N,11707.3802,E,0.00,,220111,,,D*7F
$GPVTG,,T,,M,0.00,N,0.0,K,D*16

$GPGGA,021721.000,3903.5118,N,11707.3802,E,2,08,1.0,-0.5,M,-3.1,M,1.8,0000*4C
$GPRMC,021721.000,A,3903.5118,N,11707.3802,E,0.00,,220111,,,D*7E
$GPVTG,,T,,M,0.00,N,0.0,K,D*16

$GPGGA,021722.000,3903.5118,N,11707.3802,E,2,08,1.0,-0.5,M,-3.1,M,1.8,0000*4F
$GPRMC,021722.000,A,3903.5118,N,11707.3802,E,0.00,,220111,,,D*7D
$GPVTG,,T,,M,0.00,N,0.0,K,D*16

$GPGGA,021723.000,3903.5118,N,11707.3802,E,2,07,1.2,-0.5,M,-3.1,M,2.8,0000*40
$GPGSA,A,3,28,10,02,05,23,13,17,,,,,,2.0,1.2,1.6*3D
$GPGSV,3,1,11,04,69,324,,17,56,117,34,10,51,199,45,02,40,279,14*7A
$GPGSV,3,2,11,12,29,305,,23,22,073,26,13,21,109,37,20,16,045,25*79
$GPGSV,3,3,11,05,08,214,33,28,07,174,31,42,38,146,37*44
$GPRMC,021723.000,A,3903.5118,N,11707.3802,E,0.00,,220111,,,D*7C
$GPVTG,,T,,M,0.00,N,0.0,K,D*16
$GPGGA,021724.000,3903.5118,N,11707.3802,E,2,07,1.2,-0.5,M,-3.1,M,3.8,0000*46
$GPRMC,021724.000,A,3903.5118,N,11707.3802,E,0.00,,220111,,,D*7B
$GPVTG,,T,,M,0.00,N,0.0,K,D*16

$GPGGA,021725.000,3903.5118,N,11707.3802,E,2,07,1.2,-0.5,M,-3.1,M,4.8,0000*40
$GPRMC,021725.000,A,3903.5118,N,11707.3802,E,0.00,,220111,,,D*7A
$GPVTG,,T,,M,0.00,N,0.0,K,D*16

$GPGGA,021726.000,3903.5118,N,11707.3802,E,2,07,1.2,-0.5,M,-3.1,M,1.8,0000*46
$GPRMC,021726.000,A,3903.5118,N,11707.3802,E,0.00,,220111,,,D*79
$GPVTG,,T,,M,0.00,N,0.0,K,D*16

$GPGGA,021727.000,3903.5118,N,11707.3802,E,2,08,1.0,-0.5,M,-3.1,M,1.8,0000*4A
$GPRMC,021727.000,A,3903.5118,N,11707.3802,E,0.00,,220111,,,D*78
$GPVTG,,T,,M,0.00,N,0.0,K,D*16




这是我的串口接收中断处理程序:
#pragma interrupt_handler uart0_rx_isr:19
void uart0_rx_isr(void)
{
   unsigned char GPS_Temp_Data=UDR0;
   //unsigned char GPS_Data_OK=0;//GPS数据接收完毕标志
    //static uint8 GPS_Data;//GPS有效数据存储空间
   static uint8 GPS_Data_Count=6; //GPS有效数据头“$GPRMC”到来标志
   static uint8 GPS_Data_Flag=0; //GPS有效数据头“$GPRMC”到来标志
   /*-------------检测数据头是否为所要的数据头---------------*/
   if(GPS_Temp_Data=='$')
         GPS_Data='$';
   else if(GPS_Temp_Data=='G')
         GPS_Data='G';
   else if(GPS_Temp_Data=='P')
         GPS_Data='P';
   else if(GPS_Temp_Data=='R')
         GPS_Data='R';
   else if(GPS_Temp_Data=='M')
         GPS_Data='M';
   else if(GPS_Temp_Data=='C')
   {
         GPS_Data='C';
         GPS_Data_Flag=1;
   }
   
   /*--------数据头检测成功-----------*/
   if(GPS_Data_Flag==1)
   {
         //接收有效的GPS数据
         GPS_Data=GPS_Temp_Data;
         //想要的数据接收完毕(判断是否接收到 D)
         if(GPS_Temp_Data=='D')
         {
             GPS_Data_Flag=0;
             GPS_Data_OK=1;
         }
   }      
}


我只想把 “ $GPRMC,021718.000,A,3903.5118,N,11707.3802,E,0.00,,220111,,,D*74 ”用串口收下,但我的程序接收的效果不是很好
有时接收的正确,有时接收的就不是这一串字符,,请各位指点

zxq6 发表于 2011-2-20 17:08:26

中断里面直观copy到内存缓冲,在主循环里面去处理。

guxingganyue 发表于 2011-2-21 11:36:01

回复【1楼】zxq6 小马哈
-----------------------------------------------------------------------

大哥能说明白点吗?

lcw_swust 发表于 2011-2-21 12:02:50

数据头的检测好像有问题
    else if(GPS_Temp_Data=='C')
   {
         GPS_Data='C';
         GPS_Data_Flag=1;
   }
如果开始时收到'C',这个if不就成立了吗?
还是用状态机吧:
http://bbs.dzsc.com/space/viewspacepost.aspx?postid=52942

guxingganyue 发表于 2011-2-21 12:42:57

回复【3楼】lcw_swust 小李飞刀
-----------------------------------------------------------------------

我也这么想过,,但观察数据后发现只有那句话才有C ,所以可以算是勉强正确吧
页: [1]
查看完整版本: 新年第一帖,,请给位大哥说说怎么接收一串字符呢,谢谢