首先看一下,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_的数组长度。 |
|