C#上位机学习(二)--GPS数据接收

前言

本文主要是对博主本人在学习开发的过程中的一些总结,心得,以个人名义记录。由于本人也是初学者, 个人能力浅薄、经验欠缺,言辞、代码若有不妥以至纰漏处,欢迎批评指正!(使用VS2019开发)

正文

C#上位机学习(二)--GPS数据接收_第1张图片

​ 软件主要功能是接收GPS发送的数据,进行解析处理然后显示出来。本人用的数据格式不同于以下任何一种:

GPGSV:可见卫星信息
GPGLL:地理定位信息
GPRMC:推荐最小定位信息
GPVTG:地面速度信息
GPGGA:GPS定位信息
GPGSA:当前卫星信息

因此,数据处理部分的代码是没办法用的(数据格式不同)。具体代码在后面。

主要问题

​ 开发过程中由于缺乏经验遇到了诸多问题,都是在学校的时候没好好敲代码啊!许多地方改的很慢。由于是完成后一段时间才写的,很多细节也忘了,这也是坏习惯,我早就该总结的,唉!

1、将数据转化为16进制

​ 因为不太会用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;
        }
2、判断接受的数据是否是16进制

这个地方经常由于种种原因将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;
        }
3、将接收的数据显示在文本框

数据粘连,空格不对,不显示都常常出现,直到现在还有瑕疵。不想改了

4、数据处理

将接收的数据以空格分开放入数组中,然后按照顺序转化为十进制显示出来

首先要识别报头数据,然后才能找到正确的数据在转化为十进制的时候,我这里需要将原数据倒置后在转化。

5、地图的引用

需要用到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

你可能感兴趣的:(C#,初学,上位机开发,c#,串口通信,gps)