搜索
bottom↓
回复: 2

看看能做点什么

[复制链接]

出0入0汤圆

发表于 2008-6-5 12:16:08 | 显示全部楼层 |阅读模式
我是学机电一体化的,以前做Windows程序,现在在做嵌入式开发,主要都是C/C++为主,看看我能不能参与这个项目的设计。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2008-6-5 12:54:26 | 显示全部楼层
另外,本人对机械结构也比较熟悉。

先贴一段分析GPS数据的代码,使用的CPU是ATMEGA64,从环形缓冲里面取出GPS数据,并判断数据是否有效,获取的数据包括

经度
纬度
高度
速度
角度
有效卫星数
GPS信号有效否
时间,包括时区调整

环形指针的移动不在这里处理:

//Not Chang Head's Position
void AnlzGPSData(custBUFF *pBuff, char *pEnd)
{
        unsigned char iLoop, iCount;
        char * pCharTemp, *pTH;
        unsigned char iLen = 0;
        char * pBitwiseEnd;
        char cCalSum = 0, cGetSum = 0;
        pTH = (char*)(pBuff->pCurrH);                     //Save Head
        pCharTemp = FindBFStr(pBuff, strGPGGA, pEnd);                //$GPGGA
        if(pCharTemp)
        {
                 SET_HEAD(pBuff, pCharTemp);

                 //Make Sure The Message String be Valid
                pBitwiseEnd = FindBFStr(pBuff, "*", pEnd);
                if(pBitwiseEnd == 0)
                {
                         return;
                }
                iLen = HD2PTR_LEN(pBuff, pBitwiseEnd);
                iLen -= 1;
                GetBFStr(g_pExtBuff, pBuff, iLen);
                for(iLoop = 1; iLoop < iLen; iLoop ++)
                {
                         cCalSum ^= g_pExtBuff[iLoop];
                }
               
                PTR_INC(pBuff, pBitwiseEnd);
                g_pStrTemp[0] = *pBitwiseEnd;
                PTR_INC(pBuff, pBitwiseEnd);
                g_pStrTemp[1] = *pBitwiseEnd;
                g_pStrTemp[2] = '\0';
                cGetSum = HEXStr2Int(g_pStrTemp);
               
                if(cCalSum != cGetSum)
                {//Invalid data string
                        Send2PC("Invalid Data string:",strlen("Invalid Data string:"));
                        Send2PC(g_pExtBuff, iLen);
                        Send2PC("\r\n", 2);
                        return;
                }
               
                 SET_HEAD(pBuff, pCharTemp);
                 MOV_HEAD(pBuff, strlen(strGPGGA));
                pCharTemp = FindBFSplit(pBuff, ',');                                                                                    //Time
/*
                iCount = HD2PTR_LEN(pBuff, pCharTemp);
                iCount -= 1;                                                                                                                                        //-1 for Not include ','
                GetBFStr(g_tagGPSData.gpsTime, pBuff, iCount);
                g_tagGPSData.gpsTime[4] = *(char*)(pBuff->pCurrH + 4);
                g_tagGPSData.gpsTime[5] = *(char*)(pBuff->pCurrH + 5);
*/               
                PTR_INC(pBuff, pCharTemp);
                 SET_HEAD(pBuff, pCharTemp);
               
                pCharTemp = FindBFSplit(pBuff, ',');                                                                                           //Latitude
                iCount = HD2PTR_LEN(pBuff, pCharTemp);
                iCount -= 1;
                GetBFStr(g_tagGPSData.Latitude, pBuff, iCount);
                PTR_INC(pBuff, pCharTemp);
                 SET_HEAD(pBuff, pCharTemp);
               
                pCharTemp = FindBFSplit(pBuff, ',');                                                                                         //N/S Indicator
                iCount = HD2PTR_LEN(pBuff, pCharTemp);
                iCount -= 1;
                GetBFStr(g_tagGPSData.NSIndicator, pBuff, iCount);
                PTR_INC(pBuff, pCharTemp);
                 SET_HEAD(pBuff, pCharTemp);
               
                pCharTemp = FindBFSplit(pBuff, ',');                                                                                       //Longitude
                iCount = HD2PTR_LEN(pBuff, pCharTemp);
                iCount -= 1;
                GetBFStr(g_tagGPSData.Longitude, pBuff, iCount);
                PTR_INC(pBuff, pCharTemp);
                 SET_HEAD(pBuff, pCharTemp);
               
                pCharTemp = FindBFSplit(pBuff, ',');                                                                                           //E/W indicator
                iCount = HD2PTR_LEN(pBuff, pCharTemp);
                iCount -= 1;
                GetBFStr(g_tagGPSData.EWindicator, pBuff, iCount);
                PTR_INC(pBuff, pCharTemp);
                 SET_HEAD(pBuff, pCharTemp);
               
                pCharTemp = FindBFSplit(pBuff, ',');                                                                                           //Position Fix Indictor
                PTR_INC(pBuff, pCharTemp);
                 SET_HEAD(pBuff, pCharTemp);
               
                g_Satellites = GetReturnNumber(pBuff, ',');                                                                           //Satellites Used
        }
       
        pCharTemp = FindBFStr(pBuff, strGPRMC, pEnd);                //$GPRMC
        if((pCharTemp) && (g_tagGPSData.gpsDate[0]))                //Must be Make Sure Have POS data
        {//Only for get Speed & Course & Date
                 //Make Sure The Message String be Valid
                 SET_HEAD(pBuff, pCharTemp);
                pBitwiseEnd = FindBFStr(pBuff, "*", pEnd);
                if(pBitwiseEnd == 0)
                {
                         return;
                }
                iLen = HD2PTR_LEN(pBuff, pBitwiseEnd);
                iLen -= 1;
                GetBFStr(g_pExtBuff, pBuff, iLen);
                for(iLoop = 1; iLoop < iLen; iLoop ++)
                {
                         cCalSum ^= g_pExtBuff[iLoop];
                }
               
                PTR_INC(pBuff, pBitwiseEnd);
                g_pStrTemp[0] = *pBitwiseEnd;
                PTR_INC(pBuff, pBitwiseEnd);
                g_pStrTemp[1] = *pBitwiseEnd;
                g_pStrTemp[2] = '\0';
                cGetSum = HEXStr2Int(g_pStrTemp);
               
                if(cCalSum != cGetSum)
                {//Invalid data string
                        Send2PC("Invalid Data string:",strlen("Invalid Data string:"));
                        Send2PC(g_pExtBuff, iLen);
                        Send2PC("\r\n", 2);
                        return;
                }
               
                 SET_HEAD(pBuff, pCharTemp);
                 MOV_HEAD(pBuff, strlen(strGPRMC));

                pCharTemp = FindBFSplit(pBuff, ',');                                                                                    //Time
                iCount = HD2PTR_LEN(pBuff, pCharTemp);
                iCount -= 1;                                                                                                                                        //-1 for Not include ','
                GetBFStr(g_tagGPSData.gpsTime, pBuff, iCount);

                PTR_INC(pBuff, pCharTemp);
                SET_HEAD(pBuff, pCharTemp);
                if(*pBuff->pCurrH == 'A')
                {
                        g_bGPSValid = 1;
                }
                else
                {
                        g_bGPSValid = 0;
                }
               
                for(iLoop = 0; iLoop < 5; iLoop ++)
                {
                        pCharTemp = FindBFSplit(pBuff, ',');
                        PTR_INC(pBuff, pCharTemp);
                         SET_HEAD(pBuff, pCharTemp);
                }
                pCharTemp = FindBFSplit(pBuff, ',');                                                                                        //Speed
                iCount = HD2PTR_LEN(pBuff, pCharTemp);
                iCount -= 1;
                GetBFStr(g_tagGPSData.Speed, pBuff, iCount);
                cust_int2str(g_tagGPSData.Speed, 2 * cust_str2int(g_tagGPSData.Speed));
                cust_strcpy(&g_tagGPSData.Speed[strlen(g_tagGPSData.Speed)], ".00\0");                        //Add .00 for Get it in Protocole
                PTR_INC(pBuff, pCharTemp);
                 SET_HEAD(pBuff, pCharTemp);

                pCharTemp = FindBFSplit(pBuff, ',');                                                                                        //Course
                iCount = HD2PTR_LEN(pBuff, pCharTemp);
                iCount -= 1;
                if(iCount > 0)
                        GetBFStr(g_tagGPSData.Course, pBuff, iCount);
                else
                        cust_strcpy(g_tagGPSData.Course, "0.00\0");
                PTR_INC(pBuff, pCharTemp);
                 SET_HEAD(pBuff, pCharTemp);

                pCharTemp = FindBFSplit(pBuff, ',');                                                                                        //Date
                iCount = HD2PTR_LEN(pBuff, pCharTemp);
                iCount -= 1;                                                                                                                                        //-1 for Not include ','
                GetBFStr(g_tagGPSData.gpsDate, pBuff, iCount);
               
                AdjustDateTime(&g_tagGPSData, TIME_ZONE);
        }
       
        SET_HEAD(pBuff, pTH);                           //Restor Head.
       
}

unsigned char GetGPSValid(void)
{
        return g_bGPSValid;
}

出0入0汤圆

发表于 2008-6-6 08:21:28 | 显示全部楼层
这么好的贴没人顶!
论坛有问题就解决!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-29 05:09

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

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