本帖最后由 冥冥 于 2013-4-28 13:58 编辑
来阿莫不算久,学习下载的东西不算少,是时候该做出一些贡献了。
我写过两版GSP解析代码,第一版写的时候没经验啊...是基于串口,也就是要把函数放在串口中断内,对每一个读入字符进行识别,当然用着没有任何问题,各种字段获取可以实现。但是这种方法有很多问题:
- 效率不高,因为每次串口中断都要进行一定处理;
- 可移植性差,因为针对每个不同芯片的串口中断都要重写输入部分;
- 程序不够结构化,完全采用了函数式的思维,没有面向对象,不方便以后修改。
因此项目结束后,痛定思痛决定写个通用GPS命令识别的,鉴于行业限制我只写了RMC和GGA的但是其他语句可以很容易的添加进来。新的GPS语句解析代码耦合性低。大概分了几个功能:
- 从一个字符串中截取出所需的完整的GPS语句,在此过程中是进行校验的,未截取成功会返回0;
- 对完整的GPS字符串进行自定义的掐头去尾,使用与某些场合例如:不想要$不想要后面的校验;
- 从完整的GPS字符串中提取所需的参数。
以上是对外提供的接口函数。我定义了一些结构体用来存放类似于时间、日期、经纬度这样的信息。所谓这段代码的用户只需要定义一个buffer,然后把串口的数据依次存在里面。定义一个用来接收完整语句的String,然后定义一个所需数据的变量,通过执行函数1和3就可以获取所需的数据了,这样就将代码解析跟硬件分离开来了。淡然代码还有很多可以改进的地方,例如可以用scanf获取数据,我是笨人用的是数据格式转化的方法。废话不说了,上代码。
首次发帖希望大家不要吐槽,我想代码的自注释性还算可以,如果对代码感兴趣,你阅读的时候一定能看懂,如果只是想用就不要有太多疑问,本人很懒。。。。
论坛插入代码格式搞不定,直接上附件第一次发帖不知道有没有裤子
GPS解析代码
决定上张图,这是例程的运行结果,实际上程序可以实现循环Buffer的扫描,不知有人看出来没
看大家反应不激烈 下血本 程序设计文档放出 如果反响良好再开一贴送上一个自己写的实用小工具
GPS
功能:GPS部分负责GPS数据分析,处理,应具有验证是否为指定语句类型的功能,截取指定长度指令的功能,返回某数据的功能。
接口函数
1.unsigned char GPSCmdSnapshot(
const char* const InputBuffer,
const unsigned char BufferMaxLen,
const unsigned char CmdType,
char* const ReturnStr
)
函数:判断输入字符串是否含有完整的指定语句后将语句截出到GPS全局变量中。
输入:待处理字符串首地址,用于将字符串作为参数使用。字符串最大长度,用于防止下标越界。命令类型,用于判别待解析的命令类型。GPS命令字符串首地址,用于存储完整语句。
输出:是非标志。
2.unsigned char GPSCmdCut(
const char* const CmdInput,
const unsigned char Start,
const unsigned char Discard,
char* const ReturnStr
)
函数:从完整语句中截取一部分字符串。
输入:GPS字符串首地址,用于将字符串作为参数使用。截取起始位数,用于表明从第几位截取。去掉的末尾数,用于表明有最后多少位不用返回。接收返回的字符串首地址,用于存储截取的字符串。
输出:是非标志。
3.unsigned char GPSCapParametersStr (
const char* const CmdInput,
const unsigned char ParametersSite,
char* const ReturnStr
)
函数:当前语句的某参数以字符串形式导出。
输入:GPS字符串首地址,用于将字符串作为参数使用。截取参数序号,用于表明截取第几个参数,用逗号标定。接收返回的字符串首地址,用于存储截取的字符串。
输出:是非标志。
4.unsigned char GPSCapParameters (
const char* const CmdInput,
const unsigned char CmdType,
const unsigned char ParametersSite,
void* const ReturnData
)
函数:解析字符串形式数据。
输入:GPS参数字符串首地址,用于将字符串作为参数使用。解析类型,待解析的语句类型。解析类型,待解析的参数类型。解析完成的数据的指针,用于存放解析完成的数据。
输出:是非标志。
非接口函数
1. unsigned char GPSTimeProcess (
const char* const CmdInput,
TimePoint const ReturnData
)
函数:解析时间数据。
输入:GPS参数字符串首地址,用于将字符串作为参数使用。解析完成数据,用指针返回参数,需要返回多字节多类型数据数据。
输出:是非标志。
2. unsigned char GPSCoordinateProcess (
const char* const CmdInput,
CoordinatePoint const ReturnData
)
函数:解析经纬度数据。
输入:GPS参数字符串首地址,用于将字符串作为参数使用。解析完成数据,用指针返回参数,需要可返回多字节多类型数据。
输出:是非标志。
3. unsigned char GPSCharProcess (
const char* const CmdInput,
char* const ReturnData
)
函数:解析字符型数据。
输入:GPS参数字符串首地址,用于将字符串作为参数使用。解析完成数据,用指针返回参数,返回单字节数据。
输出:是非标志。
4. unsigned char GPSUncharProcess (
const char* const CmdInput,
unsigned char* const ReturnData
)
函数:解析整型数据。
输入:GPS参数字符串首地址,用于将字符串作为参数使用。解析完成数据,用指针返回参数,返回单字节数据。
输出:是非标志。
5.unsigned char GPSFloatProcess(
const char* const CmdInput,
float* const ReturnData
)
函数:解析浮点数据。
输入:GPS参数字符串首地址,用于将字符串作为参数使用。解析完成数据,用指针返回参数,返回浮点数据。
输出:是非标志。
6. unsigned char GPSDateProcess (
const char* const CmdInput,
DatePoint const ReturnData
)
函数:解析日期数据。
输入:GPS参数字符串首地址,用于将字符串作为参数使用。解析完成数据,用指针返回参数,需要返回多字节数据。
输出:是非标志。
|