有人云:'gps的应用,仅受人们的想象力制约。'gps问世以来,已充分显示了其在导航定位领域的霸主地位。许多领域也由于gps的出现而产生革命性变化。目前,几乎全世界所有需要导航定位的用户,都被gps的高精度、全天候、全球覆盖、方便灵活和优质价廉所吸引。在嵌入式产品的开发应用中,很多领域都涉及到gps导航和定位的应用;英创的很多用户,就是在英创的嵌入式主板的基础上,外接gps应用模块,来实现gps在各种领域的合理运用。英创随之也向用户提供了相关gps的方案和例程,供用户在实际应用中进行参考。本文介绍了英创c# gps例程通过串口读取gps模块定位数据的方法。
gps模块只要处于工作状态就会源源不断地把接收并计算出的gps导航定位信息传送到连接到它的嵌入式主板串口之上,在没有进一步处理之前,传送的数据是一长串字节流信息。因此必须经过程序将其转化为有实际意义的;可供高层决策使用的定位信息数据。与其他通信协议类似,gps模块都遵循nmea-0183协议,gps进行信息提取,必须明确其帧结构,然后才能根据其结构完成对各个定位信息的提取;其发送到串口的数据主要由帧头,帧尾和帧内数据组成。根据数据帧的不同,帧头也不相同,主要有“#gpgga”,“$gpgsa”,“$gprmc”等。这些帧头标识了后续帧内数据的组成结构,各帧均以回车符和换行符作为帧尾标识一帧的结束。对于通常的情况,大家所关心的定位数据如经纬度、速度、时间、航向等均以“$gprmc”中获取得到。该帧的结构及各字段释义如下:
例:$gprmc,024813.640,a,3158.4608,n,11848.3737,e,10.05,324.27,150706,,,a*50
字段0:$gprmc,语句id,表明该语句为recommended minimum specific gps/transit data(rmc)推荐最小定位信息
字段1:utc时间,hhmmss.sss格式
字段2:状态,a=定位,v=未定位
字段3:纬度ddmm.mmmm,度分格式(前导位数不足则补0)
字段4:纬度n(北纬)或s(南纬)
字段5:经度dddmm.mmmm,度分格式(前导位数不足则补0)
字段6:经度e(东经)或w(西经)
字段7:速度,节,knots
字段8:方位角,度
字段9:utc日期,ddmmyy格式
字段10:磁偏角,(000 - 180)度(前导位数不足则补0)
字段11:磁偏角方向,e=东w=西
字段16:校验值
对于用户的应用程序来讲,要读取gps模块的定位数据,无非是实现两个简单的步骤:(1)读取串口数据;(2)将读取的数据解析出来。
我们以预装了wince嵌入式操作系统的arm9主板em9161来连接gps模块,用c#来实现读取gps模块发过来的串口数据,最方便的方法是直接使用vs2005提供的serialport串口类,这个串口类提供一个datarecieved事件响应机制,可以简单方便地读取串口数据,如:
private serialport myserialport = new serialport(); // 定义serialport串口类对象myserialport
……
myserialport.datareceived += new serialdatareceivedeventhandler(myserialport_datareceived);
// 当串口有数据收到时,启动myserialport_datarecieved事件函数
收到的串口数据是标准的string字符串,以“$gprmc”开头的帧为例,收到的每一帧数据string都以回车换行符为结尾,可以以回车换行符为标志将数据string提取出来;而且这个数据帧的每个元素均以逗号分隔,可以通过逗号分隔将这个数据帧的每个元素提取到一个string数组里面进行进一步处理。如:
string gps_text = ''; // 字符串gps_text = 接收到的串口数据,缺省定义为空
// 串口有数据收到
private void myserialport_datareceived(object sender, serialdatareceivedeventargs e)
{
gps_text = gps_text + myserialport.readexisting(); // 读取串口数据
if (gps_text.endswith('\n')) // 如果gps_text字符串最后一个字符是“回车”
{
invoke(new eventhandler(update_data)); // 通过invoke方法执行update_data函数
}
}
private void update_data(object sender, eventargs e)
{
string[] gps_info = gps_text.split(','); // 按照逗号分隔把$gprmc各种信号分割到字符串数组
…… // 处理gps_info字符串数组,完成gps数据显示、处理等功能
gps_text = ''; // 置空gps_text以便存储新的串口接收到的字符串
}
英创提供的例程运行界面如下:
芯片市场: Intel迅猛三星止步 高通进步快
GNSS模块有哪些类型
索尼和微软合作达成 将采用微软Azure来改进其云服务和内容流服务
水浸传感器的特点及工作原理解析
95届中国电子展释放“新基建”发展的新动能
英创信息技术C#通过串口读取GPS模块定位数据的方法
差示扫描量热仪dsc能测什么
努比亚z17/荣耀9/金立S10/vivo X9s哪款手机拍照比较好?努比亚z17/荣耀9/金立S10/vivo X9s手机拍照评测对比
ATECLOUD为DC-DC电源模块测试提供整体方案,解决测试痛点
带PIN二极管的电流源DAC提供RF衰减和热补偿
工业物联网与物联网 "工业4.0"的区别
74ls259中文资料汇总(74ls259引脚图及功能_逻辑功能及特性)
你想选择哪一种Java框架
美信cortex-m3内核芯片的启动过程及连接文件介绍
波士顿动力机器人又放出一波机器人逆天动作!
利用滨松反射式纯相位空间光调制器实现对光场波前和偏振的双重调制
LED屏企行业集中度不断提高 急需寻找新的市场突破口
HD300B电容电流测试仪操作使用说明及特点
华为智慧公路军团Marketing解决方案加速千行百业数字化和智能化转型
英伟达开发了一套训练机器人的系统,教机器人通过观察人类活动来行动