新年第一帖,,请给位大哥说说怎么接收一串字符呢,谢谢
我想接收一固定的字符串,用串口接收,,单片机用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 ”用串口收下,但我的程序接收的效果不是很好
有时接收的正确,有时接收的就不是这一串字符,,请各位指点 中断里面直观copy到内存缓冲,在主循环里面去处理。 回复【1楼】zxq6 小马哈
-----------------------------------------------------------------------
大哥能说明白点吗? 数据头的检测好像有问题
else if(GPS_Temp_Data=='C')
{
GPS_Data='C';
GPS_Data_Flag=1;
}
如果开始时收到'C',这个if不就成立了吗?
还是用状态机吧:
http://bbs.dzsc.com/space/viewspacepost.aspx?postid=52942 回复【3楼】lcw_swust 小李飞刀
-----------------------------------------------------------------------
我也这么想过,,但观察数据后发现只有那句话才有C ,所以可以算是勉强正确吧
页:
[1]