本文主要是对博主本人在学习开发的过程中的一些总结,心得,以个人名义记录。由于本人也是初学者, 个人能力浅薄、经验欠缺,言辞、代码若有不妥以至纰漏处,欢迎批评指正!(使用VS2019开发)
软件主要功能是接收GPS发送的数据,进行解析处理然后显示出来。本人用的数据格式不同于以下任何一种:
GPGSV:可见卫星信息
GPGLL:地理定位信息
GPRMC:推荐最小定位信息
GPVTG:地面速度信息
GPGGA:GPS定位信息
GPGSA:当前卫星信息
因此,数据处理部分的代码是没办法用的(数据格式不同)。具体代码在后面。
开发过程中由于缺乏经验遇到了诸多问题,都是在学校的时候没好好敲代码啊!许多地方改的很慢。由于是完成后一段时间才写的,很多细节也忘了,这也是坏习惯,我早就该总结的,唉!
因为不太会用C#,也因为懒,在进行进制转换的时候很是头疼,反而费了更大的功夫。最终还是用的网上的代码。
public static string GetHexFromChs(string s)//字符转化为16进制字符包括汉字数字字母
{
System.Text.Encoding chs = System.Text.Encoding.GetEncoding("gb2312");
byte[] bytes = chs.GetBytes(s);
StringBuilder Text = new StringBuilder();
for (int i = 0; i < bytes.Length; i++)
{
if (Convert.ToString(bytes[i]).Length < 2)
{
Text.Append("0");
}
Text.Append(string.Format("{0:X}", bytes[i]));
Text.Append(" ");
}
string ggg = Text.ToString();
if (ggg.Length >= 1)
{
string ggf = ggg.Substring(ggg.Length - 1, 1);
if (ggf == " ")
{
ggg = ggg.Remove(ggg.Length - 1, 1);
}
}
return ggg;
}
这个地方经常由于种种原因将16进制再次转换
public static bool IsHexadecimal(string str)//判断是否为十六进制
{
const string PATTERN = @"[A-Fa-f0-9]+$";
bool bo = System.Text.RegularExpressions.Regex.IsMatch(str, PATTERN);
if (bo == true)
{
// 长度判断 长度+1 与3的余数为0表示长度符合要求
if ((str.Length + 1) % 3 != 0)
{
bo = false;
}
else
{
// 空格判断,空格数为长度+1 与3的余数
if (str.Length > 2)
{
string[] arr = str.Split(new char[] { ' ' });
//分离后,得到空格数
int space_count = arr.Length - 1;
//实际空格数
int n = ((str.Length + 1) / 3) - 1;
// 获得字符串中所有的空格数
int cout = System.Text.RegularExpressions.Regex.Matches(str, @" ").Count;
if (space_count != n || cout != space_count)
{
bo = false;
}
else
{
for (int i = 0; i < str.Length; i++)
{
if ((i + 1) % 3 == 0)
{
// 判断 2 5 8 11 .. 位置是否为空格
if (str[i] != ' ')
{
bo = false;
break;
}
}
}
}
}
else if (str.Length < 2)
{
bo = false;
}
}
}
return bo;
}
数据粘连,空格不对,不显示都常常出现,直到现在还有瑕疵。不想改了
将接收的数据以空格分开放入数组中,然后按照顺序转化为十进制显示出来
首先要识别报头数据,然后才能找到正确的数据在转化为十进制的时候,我这里需要将原数据倒置后在转化。
需要用到webBrowser控件。
//初始化地图坐标
private void webBrowser1_DocumentCompleted_1(object sender, WebBrowserDocumentCompletedEventArgs e)
{
webBrowser1.Document.InvokeScript("setLocation", new object[] { sdX, sdY });
}
//将经纬度传给地图
sdY = Convert.ToDouble(textBox1.Text);
sdX = Convert.ToDouble(textBox4.Text);
//刷新地图显示位置
//webBrowser1.Document.InvokeScript("setLocation", new object[] { sdX, sdY });
//这句不懂
webBrowser1.Invoke(new Action(() => webBrowser1.Document.InvokeScript
("setLocation", new object[] { sdX, sdY })));
百度地图链接:http://lbsyun.baidu.com/jsdemo.htm#c2_5
很好用。
好像就这些了吧。具体还是要看代码,直接复制粘贴是行不通的,代码还是要自己看自己改,特别是数据的处理。初学虽然难,还是学了不少东西,在此期间参考了许多文章(有些记不得了,如有需要,还请告知)。整理的很不行,如果有什么问题可以多多交流。如果有帮到您,还请点个赞
源码已经上传,链接:https://download.csdn.net/download/qq_41661878/12691170
参考链接:
串口+GPS定位软件 C#上位机代码解读(二)https://blog.csdn.net/yichu5074/article/details/81039831?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159659969419724846439591%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=159659969419724846439591&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v3~rank_business_v1-7-81039831.ecpm_v3_rank_business_v1&utm_term=c%23+%E5%A6%82%E4%BD%95%E6%8E%A5%E5%8F%97GPS%E6%95%B0%E6%8D%AE&spm=1018.2118.3001.4187
C#调用百度地图API经验分享(三)https://blog.csdn.net/kkkkkxiaofei/article/details/8660409
16进制字符串和字节之间互转https://blog.csdn.net/qmdweb/article/details/80899117
判断符合要求的16进制字符串格式https://blog.csdn.net/taoerit/article/details/78758012