搜索
bottom↓
回复: 4

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

[复制链接]

出0入0汤圆

发表于 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[60];  //GPS有效数据存储空间
     static uint8 GPS_Data_Count=6; //GPS有效数据头“$GPRMC”到来标志
     static uint8 GPS_Data_Flag=0; //GPS有效数据头“$GPRMC”到来标志
     /*-------------检测数据头是否为所要的数据头---------------*/
     if(GPS_Temp_Data=='$')
         GPS_Data[0]='$';
     else if(GPS_Temp_Data=='G')
         GPS_Data[1]='G';
     else if(GPS_Temp_Data=='P')
         GPS_Data[2]='P';
     else if(GPS_Temp_Data=='R')
         GPS_Data[3]='R';
     else if(GPS_Temp_Data=='M')
         GPS_Data[4]='M';
     else if(GPS_Temp_Data=='C')
     {
         GPS_Data[5]='C';
         GPS_Data_Flag=1;
     }
     
     /*--------数据头检测成功-----------*/
     if(GPS_Data_Flag==1)
     {
         //接收有效的GPS数据
         GPS_Data[GPS_Data_Count ++]=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 ”用串口收下,但我的程序接收的效果不是很好
有时接收的正确,有时接收的就不是这一串字符,,请各位指点

出0入22汤圆

发表于 2011-2-20 17:08:26 | 显示全部楼层
中断里面直观copy到内存缓冲,在主循环里面去处理。

出0入0汤圆

 楼主| 发表于 2011-2-21 11:36:01 | 显示全部楼层
回复【1楼】zxq6 小马哈
-----------------------------------------------------------------------

大哥能说明白点吗?

出0入0汤圆

发表于 2011-2-21 12:02:50 | 显示全部楼层
数据头的检测好像有问题
    else if(GPS_Temp_Data=='C')
     {
         GPS_Data[5]='C';
         GPS_Data_Flag=1;
     }
如果开始时收到'C',这个if不就成立了吗?
还是用状态机吧:
http://bbs.dzsc.com/space/viewspacepost.aspx?postid=52942

出0入0汤圆

 楼主| 发表于 2011-2-21 12:42:57 | 显示全部楼层
回复【3楼】lcw_swust 小李飞刀
-----------------------------------------------------------------------

我也这么想过,,但观察数据后发现只有那句话才有  C ,所以可以算是勉强正确吧
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-4 14:04

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表