分享

串口打印GPS信息 sprintf 使用

 寝乡园 2015-06-12
首先看一下,GPS包的格式:

struct PACKED Location {
    union {
        Location_Option_Flags flags;                    ///< options bitmask (1<<0 = relative altitude)
        uint8_t options;                                /// allows writing all flags to eeprom as one byte
    };
    // by making alt 24 bit we can make p1 in a command 16 bit,
    // allowing an accurate angle in centi-degrees. This keeps the
    // storage cost per mission item at 15 bytes, and allows mission
    // altitudes of up to +/- 83km
    int32_t alt:24;                                     ///< param 2 - Altitude in centimeters (meters * 100)
    int32_t lat;                                        ///< param 3 - Lattitude * 10**7
    int32_t lng;                                        ///< param 4 - Longitude * 10**7
};
Location current_loc; //一个GPS变量
我需要的是lat和lng,分别是经度和纬度,拿lat举例:

定义一个字符串数组来存储相应的信息,
char     curlocation[48]; //数组可以设置大一点
uint8_t  cur_[48];

memset(curlocation, 0, strlen(curlocation) ); //清零一下数组,第一个参数是(char *)类型
//将经度值先转换成浮点型,并用sprintf按格式转换成字符串的形式,注意sprintf要求的第一个参数是(char *)类型的。
sprintf(curlocation, "Cur lat is %.7f \r\n", ((double)current_loc.lat)/10000000);
现在就有了char *类型的字符串了,

但我的接下来调用的串口发送函数:write的参数是(uchar *)类型的,那么就需要将(char *)的转换为(uchar *)。

一开始想直接将(char *)类型的数据转换为(uchar *)会出问题,如curlocation数组中有负值该怎么办?后来想通了。sprintf将一个浮点型数据转化成对应的字符串数据,这个字符串是由字符(0、1、2...9和小数点组成的),况且ASCII通常的字符的ASCII码值都小于等于127。所以通常字符在char和uchar类型之间进行转换都是没有问题的。

那么,对其进行强制转化:
temp=0;
while (curlocation[temp++] != '\0') 
{ cur_[temp-1]=(uint8_t)curlocation[temp-1];    } //cur中没有‘\0’结束符

//最后就可以调用串口发送函数了,把(hal.uartE->write)看做一个串口发送函数即可
hal.uartE->write(cur_,strlen(curlocation));

注意:一开始我没有使用strlen来计算数组的大小,而是用sizeof。这样不对,sizeof计算的数组占用内存的大小,导致会多打印出一些乱码来(这些是由于cur_没有被清零一下,那么它的内存中的数据就是不确定的)。而strlen可以计算有用字符串的长度,它遇到'\0'为止,而之前的sprintf会将字符串中结束符也拷贝到目标数组中。最后也要注意write(cur_,strlen(curlocation))的写法,发送的cur_数组中的数据,但strlen的参数也必须是(char *),所以可以用被拷贝的数组长度来替代cur_的数组长度。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多