精华内容
下载资源
问答
  • 基于QT编写的串口通信接收GPS信号的上位机软件,基于QT界面编写的源码,可以生成release版本。详细加了注释,以及每个功能函数的意义,综合使用了槽,变量函数等,对于初学者上手学习和实践QT有帮助。
  • GPS数据分析上位机,解析GPS得到的数据,精度和纬度。方便调试GPS的定位状态。 支持GPS模式配置,指定的语句输出等。 博客地址: https://blog.csdn.net/xiaolong1126626497/article/details/108080067
  • 矿车车载GPS上位机软件设计与开发.pdf
  • GPS接收机(五)基于C#的GPS软件上位机

    千次阅读 2019-03-13 00:35:53
    前面已经搭建了一个可以接受GPS数据的简易接收机,接下来将要编写一个上位机处理接收到的数据,并进行处理显示。 效果示意图 接收文本数据,并进行表格显示 接受文本数据,并进行图表显示 前台代码如下 &...

    前面已经搭建了一个可以接受GPS数据的简易接收机,接下来将要编写一个上位机处理接收到的数据,并进行处理显示。

    效果示意图

    接收文本数据,并进行表格显示
    在这里插入图片描述
    接受文本数据,并进行图表显示
    在这里插入图片描述

    前台代码如下

        <Grid>
            <TextBox x:Name="Tip" HorizontalAlignment="Left" Height="24" Margin="8,176,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="40" BorderBrush="{x:Null}" Background="{x:Null}" FontSize="16" IsReadOnly="True" Foreground="Black" HorizontalContentAlignment="Center" Text="提示"/>
            <ComboBox x:Name="Port_Select" RenderTransformOrigin="1.436,2.058" BorderBrush="Black" Foreground="Black" FontFamily="Microsoft YaHei" Background="{x:Null}" Height="32" VerticalAlignment="Top" HorizontalAlignment="Left" Width="76" MouseEnter="PortSelect_MouseEnter" Margin="75,30,0,0" FontSize="13.333" VerticalContentAlignment="Center"/>
            <Button x:Name="Port_Open" Content="打开串口" Margin="75,170,0,0" RenderTransformOrigin="-0.833,1.211" Click="PortOpen_Click" Background="{x:Null}" BorderBrush="Black" FontFamily="Microsoft YaHei" FontSize="16" HorizontalAlignment="Left" Width="76" Height="32" VerticalAlignment="Top"/>
            <TextBox x:Name="textBox" HorizontalAlignment="Left" Height="300" Margin="186,36,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="396"/>
            <GroupBox Header="接收数据" Height="326" HorizontalAlignment="Left" Margin="186,10,0,0" x:Name="GroupBox" VerticalAlignment="Top" Width="396"/>
            <ComboBox x:Name="comboBox" HorizontalAlignment="Left" Margin="75,103,0,0" VerticalAlignment="Top" Width="76" Background="{x:Null}" Height="32" FontSize="13.333" VerticalContentAlignment="Center" >
                <ComboBoxItem Content="9600"/>
                <ComboBoxItem Content="14400"/>
                <ComboBoxItem Content="19200"/>
                <ComboBoxItem Content="38400"/>
                <ComboBoxItem Content="57600"/>
                <ComboBoxItem Content="115200"/>
            </ComboBox>
            <TextBlock x:Name="textBlock" HorizontalAlignment="Left" Margin="8,36,0,0" VerticalAlignment="Top" RenderTransformOrigin="-0.673,-3.125" Height="24" Width="40" Text="端口" FontSize="16" LineHeight="8" TextWrapping="Wrap" TextAlignment="Center"/>
            <TextBlock x:Name="textBlock1" HorizontalAlignment="Left" Margin="8,108,0,0" TextWrapping="Wrap" Text="波特率" VerticalAlignment="Top" Width="60" Height="28" FontSize="16"/>
            <Button x:Name="clr" Content="clear" HorizontalAlignment="Left" Margin="8,240,0,0" VerticalAlignment="Top" Width="50" Click="Clr_Click" Height="28" FontSize="16" Background="{x:Null}"/>
            <Button x:Name="chart" Content="chart" HorizontalAlignment="Left" Margin="100,240,0,0" VerticalAlignment="Top" Width="50" Click="Chart_Click" Height="28" Background="{x:Null}" FontSize="16"/>
            <Button x:Name="table" Content="table" HorizontalAlignment="Left" Margin="100,300,0,0" VerticalAlignment="Top" Width="50" RenderTransformOrigin="0.037,-0.94" Height="28" Background="{x:Null}" FontSize="16" Click="Table_Click"/>
            <Button x:Name="save" Content="save" HorizontalAlignment="Left" Margin="8,300,0,0" VerticalAlignment="Top" Width="50" Height="28" Background="{x:Null}" FontSize="16" Click="Save_Click"/>
        </Grid>
    

    后台代码如下

    public  partial class MainWindow : Window
        {
            string getstring = "";
            string putoutstring = "";
            //声明串口
            SerialPort ComPort = new SerialPort();
            public delegate void Display(byte[] buffer);
            public Display Dis_UI;
            public   MainWindow()
            {     
                InitializeComponent();
                ComPort.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
                Dis_UI = new Display(display);
            }
            //接收数据事件
            void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                int count = ComPort.BytesToRead;
                byte[] buffer = new byte[count];
                ComPort.Read(buffer, 0, count);
                //多线程操作UI
                this.Dispatcher.Invoke(Dis_UI, buffer);
            }
            public  void display(byte[] buf)
            {
                for (int i = 0; i < buf.Length; i++)
                    {
                        getstring += Char.ConvertFromUtf32(buf[i]);
                    }
                
                if  (getstring .Contains(@"$GNVTG") )
                    {
                        App.wxid.Clear();
                        App.wxxzb.Clear();
                        string pattern = @"\$BDGSA,(?<GPS>[\s\S]+)\$BDGSV";
                        Match mc = Regex .Match(getstring, pattern);
                        string tempStr = mc.Groups["GPS"].ToString ();
                        string[] Gpsarray = Regex.Split(tempStr, "\r\n", RegexOptions.IgnoreCase);
                        foreach (string istring in Gpsarray)
                        {
                            try
                            {
                                if (istring.Contains(@"$GPGSV"))
                                {
                                    string[] sArray = Regex.Split(istring, ",", RegexOptions.IgnoreCase);
                                    try
                                    {
                                        App.wxid.Add(sArray[4]);
                                        App.wxxzb.Add(Convert.ToDouble(sArray[7]));
                                    }
                                    catch
                                    {
                                    }
                                }
                            }
                            catch
                            {
                            }
                        }
                        textBox.Text =getstring+ "\n" + System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + "\n";
                        putoutstring = getstring + "\n" + System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + "\n";
                        getstring = "";
                    }
            }
            //串口集
            public string[] portNames { get; set; }
            //打开标志
            bool openFlag = false;
            //得到当前可用串口
            private void GetPort()
            {
                portNames = SerialPort.GetPortNames();         //得到可用串口
                if (portNames.Length > 0)
                {
                    Tip.Text = "检测到" + portNames.Length + "个可用串口";
                }
                else
                {
                    Tip.Text = "未检测到串口";
                    Port_Select.ItemsSource = null;
                    return;
                }
                Port_Select.ItemsSource = portNames;           //添加可用串口
                Port_Select.SelectedValue = portNames[0];      //默认选中
            }
            //打开事件
            private void PortOpen_Click(object sender, RoutedEventArgs e)
            {
                OpenPort();
            }
            //鼠标进入事件
            private void PortSelect_MouseEnter(object sender, MouseEventArgs e)
            {
                if (openFlag == false)
                {
                    GetPort();
                }
            }
            //打开串口方法
            private void OpenPort()
            {
                if (Port_Select.SelectedValue == null)
                {
                    GetPort();
                }
                if (openFlag == false)
                {
                    try
                    {
                        //设置
                        ComPort.PortName = Port_Select.SelectedValue.ToString();
                        ComPort.BaudRate = Convert.ToInt32(comboBox.SelectionBoxItem.ToString ());
                        ComPort.Parity = Parity.None;
                        ComPort.StopBits = StopBits.One;
                        ComPort.DataBits = 8;
                        ComPort.Handshake = Handshake.None;
                        // ComPort.RtsEnable = true;
                        ComPort.Open();
                        Tip.Text = "打开成功";
                        openFlag = true;
                        Port_Open.Content = "关闭串口";
                    }
                    catch
                    {
                        Tip.Text = "打开失败";
                    }
                }
                else
                {
                    try
                    {
                        ComPort.DiscardInBuffer();
                        ComPort.DiscardOutBuffer();
                        ComPort.Close();
                        openFlag = false;
                        Port_Open.Content = "打开串口";
                        Tip.Text = "关闭成功";
                    }
                    catch
                    {
                        Tip.Text = "关闭失败";
                    }
                }
            }
            //清除显示文本
            private void Clr_Click(object sender, RoutedEventArgs e)
            {
                this.textBox .Text ="";
            }
            //打开图表窗口
            private void Chart_Click(object sender, RoutedEventArgs e)
            {
                chartwindow Chartwindow = new chartwindow();
                Chartwindow.Show();
            }
            //打开表格窗口
            private void Table_Click(object sender, RoutedEventArgs e)
            {
                table Table = new ck.table();
                Table.Show();
            }
            //保存数据文本
            private void Save_Click(object sender, RoutedEventArgs e)
            {
                SaveFileDialog saveDlg = new SaveFileDialog();
                saveDlg.Filter = "文本(*.txt)|*.txt;|Excle(*.xls)|*.xls";
                if (saveDlg.ShowDialog() == true)
                {
                    using (FileStream fs = new FileStream(saveDlg.FileName, FileMode.Create))
                    {
                        using (StreamWriter sw = new StreamWriter(fs, Encoding.Default))
                        {
                            sw.WriteLine(putoutstring);
                        }
                    }
                }
            }
        }
    
    展开全文
  • 但是今天突然想到了这个东西,找了很久才找到的原文件,而且代码质量保证,所以我觉得,8分虽然有点高了,但总比下载一个充满未知的东西要好得多,Qt5.5开发,Qt5.8正常运行测试,希望对有需要的朋友有帮助。
  • 环境 :windows平台 ,qt5.92 msvc2015 32位 基于webenginewidgets控件。 下图是作品图

    环境 :windows平台 ,qt5.92 msvc2015 32位 基于webenginewidgets模块。
    下图是作品图
    在这里插入图片描述
    下面讲一下具体流程,希望帮助有需要的人。

    展开全文
  • gps电脑接收端上位机源码 通过串口显示GPS收到的信息 分享给大家
  • 串口+GPS定位软件 C#上位机代码解读(一)

    千次阅读 多人点赞 2018-07-14 00:39:42
    本博文讲述一个问题:PC上位机如何将串口接收到的GPS数据解析,并把位置信息显示在百度地图上?1.串口接收GPS模块发送的数据,并将其显示在接收区 private string receiveData; //接收数据 private void Receive...

    本博文讲述一个问题:PC上位机如何将串口接收到的GPS数据解析,并把位置信息显示在百度地图上?


    1.串口接收GPS模块发送的数据,并将其显示在接收区


            private string receiveData;


            //接收数据
    
            private void ReceiveData(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                receiveData = serial.ReadExisting();
                Dispatcher.Invoke(DispatcherPriority.Send, new UpdateTextDelegate(ShowData), receiveData);
                Dispatcher.Invoke(DispatcherPriority.Send, new UpdateTextDelegate(NMEADecodeGPS), receiveData);
            }
    
            //显示数据
            private void ShowData(string text)
            {
                string receiveText = text;
    
                try
                {
                        //更新接收字节数
                        receiveBytesCount += (UInt32)receiveText.Length;
                        statusReceiveByteTextBlock.Text = receiveBytesCount.ToString();
    
    
                        //没有关闭数据显示
                        if (stopShowingButton.IsChecked == false)
                        {
                            //字符串显示
                            if (hexadecimalDisplayCheckBox.IsChecked == false)
                            {
                                receiveTextBox.AppendText( receiveText);
    
                            }
                            else //16进制显示
                            {
                                foreach (byte str in receiveText)
                                {
                                    receiveTextBox.AppendText(string.Format("{0:X2} ", str));
                                }
                            }
                        }
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                }
               
    
            }

    2.调用nmealib库解析GPS原始数据,并显示相关信息



            private void ReceiveData(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                receiveData = serial.ReadExisting();
                Dispatcher.Invoke(DispatcherPriority.Send, new UpdateTextDelegate(ShowData), receiveData);
                Dispatcher.Invoke(DispatcherPriority.Send, new UpdateTextDelegate(NMEADecodeGPS), receiveData);
            }

            //供串口接收到数据后调用,对接收到的品数据进行解码
            private void NMEADecodeGPS(string gpsData)
            {
             
                nmea_parse(ref gpsParser, gpsData, gpsData.Length, ref gpsInfo);
    
                UpdateInfo(ref gpsInfo);
            
            
            }

           #region nmea解码
    
            //根据解码结果更新gps信息
            private void UpdateInfo(ref nmeaINFO gpsInfo)
            {
                nmeaTIME beiJingTime = new nmeaTIME();
    
                //转换成北京时间
                GMTconvert(ref gpsInfo.utc,ref beiJingTime,8,1);
                timeLabel.Content = Convert.ToString(beiJingTime.year) + "年" + Convert.ToString(beiJingTime.mon) + "月" + Convert.ToString(beiJingTime.day) + "日" + Convert.ToString(beiJingTime.hour) + ":" + Convert.ToString(beiJingTime.min) + ":" + Convert.ToString(beiJingTime.sec);
                //经度
                longitudeLabel.Content = Convert.ToString(DegreeConvert(gpsInfo.lon))+" E";
                //纬度
                latitudeLabel.Content = Convert.ToString(DegreeConvert(gpsInfo.lat))+" N";
                
    
                elevatiionLabel.Content = Convert.ToString(gpsInfo.elv)+" 米";
                speedLabel.Content = Convert.ToString(gpsInfo.speed)+" km/h";
                directionLabel.Content = Convert.ToString(gpsInfo.declination);
    
                switch (gpsInfo.sig)
                {
                    case 0:
                        signalLevalLabel.Content = "未定位";
                        break;
                    case 1:
                        signalLevalLabel.Content = "标准GPS定位";
                        break;
                    case 2:
                        signalLevalLabel.Content = "差分GPS定位";
                        break;
                    default:
                        break; 
                }
    
                switch (gpsInfo.fix)
                {
                    case 1:
                        operationModeLabel.Content = "未定位";
                        break;
                    case 2:
                        operationModeLabel.Content = "2D定位";
                        break;
                    case 3:
                        operationModeLabel.Content = "3D定位";
                        break;
                    default:
                        break;
                }
    
                sateliteInView.Content = Convert.ToString(gpsInfo.satinfo.inview)+" 颗";
                sateliteInUse.Content = Convert.ToString(gpsInfo.satinfo.inuse) + " 颗";
    
                positionPrecisionLabel.Content = Convert.ToString(gpsInfo.PDOP);
                horizontalPrecisionLabel.Content = Convert.ToString(gpsInfo.HDOP);
                verticalPrecisionLabel.Content = Convert.ToString(gpsInfo.VDOP);
    
                if (baiDuMap.IsLoaded)
                {
                    //非零时才作标注
                    if(gpsInfo.lon!=0 &&gpsInfo.lat!=0)
                    {
                        //调用javascritpt函数标注地图
                        WebBrowser mapWB = (WebBrowser)baiDuMap.Content;
                        mapWB.InvokeScript("theLocation", new object[] { DegreeConvert(gpsInfo.lon) , DegreeConvert(gpsInfo.lat) });
    
                    }
                }
            
            
            }
    
            //对gps日志文件进行解码
            public void NMEADecodeGPSLog(string path)
            {
                string readbuf  = "";
                try
                {
    
                    nmea_zero_INFO(ref gpsInfo);
    
                    nmea_parser_init(ref gpsParser);
    
                    gpsInfoTabControl.SelectedIndex = 1;
    
    
                    foreach (string line in File.ReadLines(path))
                    {
    
                        readbuf = line + "\r\n";
                        nmea_parse(ref gpsParser, readbuf, readbuf.Length, ref gpsInfo);
    
                        UpdateInfo(ref gpsInfo);
    
                    }   
    
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
               }
    
            
            }
    
    
            //供串口接收到数据后调用,对接收到的品数据进行解码
            private void NMEADecodeGPS(string gpsData)
            {
             
                nmea_parse(ref gpsParser, gpsData, gpsData.Length, ref gpsInfo);
    
                UpdateInfo(ref gpsInfo);
            
            
            }
            #endregion
    
            private void GPSFrame_Navigated(object sender, NavigationEventArgs e)
            {
                //serialSettingBorder.IsEnabled = true;
                //serialPortControlBorder.IsEnabled = true;
            }
    
    
    
        }

    gpsInfo结构体中存放着nmea解析后的所有GPS信息

    nmeaINFO gpsInfo = new nmeaINFO();
    
    
            public struct nmeaINFO
            {
                public int smask;      /**< Mask specifying types of packages from which data have been obtained */
    
                public nmeaTIME utc;       /**< UTC of position */
    
                public int sig;        /**< GPS quality indicator (0 = Invalid; 1 = Fix; 2 = Differential, 3 = Sensitive) */
                public int fix;        /**< Operating mode, used for navigation (1 = Fix not available; 2 = 2D; 3 = 3D) */
    
                public double PDOP;       /**< Position Dilution Of Precision */
                public double HDOP;       /**< Horizontal Dilution Of Precision */
                public double VDOP;       /**< Vertical Dilution Of Precision */
    
                public double lat;        /**< Latitude in NDEG - +/-[degree][min].[sec/60] */
                public double lon;        /**< Longitude in NDEG - +/-[degree][min].[sec/60] */
                public double elv;        /**< Antenna altitude above/below mean sea level (geoid) in meters */
                public double speed;      /**< Speed over the ground in kilometers/hour */
                public double direction;  /**< Track angle in degrees True */
                public double declination; /**< Magnetic variation degrees (Easterly var. subtracts from true course) */
    
                public nmeaSATINFO satinfo; /**< Satellites information */
    
            }


    3.调用百度地图,将经纬度信息显示在地图上


                if (baiDuMap.IsLoaded)
                {
                    //非零时才作标注
                    if(gpsInfo.lon!=0 &&gpsInfo.lat!=0)
                    {
                        //调用javascritpt函数标注地图
                        WebBrowser mapWB = (WebBrowser)baiDuMap.Content;
                        mapWB.InvokeScript("theLocation", new object[] { DegreeConvert(gpsInfo.lon) , DegreeConvert(gpsInfo.lat) });
    
                    }
                }
            


    展开全文
  • 提示:项目里需要将杂乱的GPS代码解析并显示出来,并且实现自动保存成excel形式的文档,方便查看 问题描述: 串口接收: GPRMC格式的GPS信息,包含推荐最小定位信息。 消息格式为: $GPRMC,HHMMSS.SS,A,DDMM.MMM,N...

    项目应用场景:

    提示:项目里需要将杂乱的GPS代码解析并显示出来,并且实现自动保存成excel形式的文档,方便查看


    问题描述:

    串口接收: GPRMC格式的GPS信息,包含推荐最小定位信息。

    消息格式为:
    $GPRMC,HHMMSS.SS,A,DDMM.MMM,N,DDDMM.MMM,W,Z.Z,Y.Y,DDMMYY,D.D,V *CC:


    上位机开发:

    上位机界面
    界面


    开发思路与源码:

    第一部分:串口的基本设置

    基础设置,包括串口号,波特率等等,打开串口设置
    1.初始设计和打开串口按钮点击事件

       private string saveFileName = null;
            private string FilePath = null;    // 打开文件路径
            private string gpsinformation;
            private object thisLock = new object();    // 锁住线程        
            public event SerialPortEventHandler comReceiveDataEvent = null;  // 定义串口接收数据响应事件
            // 数据状态  
            private static int receCount = 0;    // 接收数据量
    
    
            public SerialDebug()
            {
                InitializeComponent();
                InitializeSerialSet(); // 初始化串口设置          
    
            }
    
            /// <summary>
            /// 串口初始化设置
            /// </summary>
    
            public void InitializeSerialSet()
            {
                InitializePorts();   // 初始化串口号
                // 初始化波特率
                comboBox_BandRate.Text = comboBox_BandRate.Items[3].ToString();
                // 初始化校验位
                comboBox_Check.Text = comboBox_Check.Items[0].ToString();
                // 初始化数据位
                comboBox_Data.Text = comboBox_Data.Items[0].ToString();
                // 初始化停止位
                comboBox_Stop.Text = comboBox_Stop.Items[0].ToString();
    
            }
    
            /// <summary>
            /// 可用串口扫描,并且显示可用串口
            /// </summary>
            public void InitializePorts()
            {
                comboBox_Serial.Items.Clear();   // 清空原来的信息
                // 返回可用串口号,形式:COM3
                string[] arraysPostsNames = SerialPort.GetPortNames();  // 获取所有可用的串口号          
                if (arraysPostsNames.Length > 0)
                // 检查串口号是否正确
                {
    
                    Array.Sort(arraysPostsNames);  // 使用默认进行排序,从小到大肾虚
                    for (int i = 0; i < arraysPostsNames.Length; i++)
                    {
                        comboBox_Serial.Items.Add(arraysPostsNames[i]);  // 将所有可用串口加载到串口显示框当中
                    }
                    comboBox_Serial.Text = arraysPostsNames[0];   // 默认选择第一个串口
    
                    comboBox_Serial.Enabled = true;   // 打开选择框
                    // 设置状态栏属性
                    toolStripStatus_Port.Text = "串口号:" + comboBox_Serial.Text;  // 设置状态栏的情况                   
                    toolStripStatus_Port.ForeColor = Color.Black; // 设置为红色
    
                }
                else
                {
                    toolStripStatus_Port.Text = "没有可用串口";  // 设置状态栏的情况                   
                    toolStripStatus_Port.ForeColor = Color.Red; // 设置为红色
                    comboBox_Serial.Text = "None";   // 提示没有可用串口
                    comboBox_Serial.Enabled = false;   // 禁止打开串口选择框
                }
            }
    
            /// <summary>
            /// 串口读取数据响应方法
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void serialPortMonitor_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                ReceiveData();
                //Thread.Sleep(60000);//线程挂起,单位为毫秒,延时一分钟接收数据
               // delay(10000);
            }
      private void button_OK_Click(object sender, EventArgs e)
            {
                if (serialPort1 == null)
                {
                    return;
                }
    
                if (serialPort1.IsOpen == false)
                {
                    serialPort1.PortName = comboBox_Serial.Text;
                    serialPort1.BaudRate = Convert.ToInt32(comboBox_BandRate.Text);
                    serialPort1.Parity = (Parity)Enum.Parse(typeof(Parity), comboBox_Check.Text);   // 强制类型转换
                    serialPort1.DataBits = Convert.ToInt32(comboBox_Data.Text);
                    serialPort1.StopBits = (StopBits)Enum.Parse(typeof(StopBits), comboBox_Stop.Text);
                    try
                    {
                        serialPort1.Open();
    
                        // 设置按键的使用权限
                        comboBox_Serial.Enabled = false;
                        comboBox_BandRate.Enabled = false;
                        comboBox_Check.Enabled = false;
                        comboBox_Data.Enabled = false;
                        comboBox_Stop.Enabled = false;
                        button_Refresh.Enabled = false;
                       // 打开属性变为关闭属性
                        button_OK.Text = "关闭串口";
    
                        toolStripStatus_Port.Text = "连接串口:" + comboBox_Serial.Text;
                        toolStripStatus_Port.ForeColor = Color.Green; // 设置为绿色
    
                    }
                    catch (Exception)
                    {
                        toolStripStatus_Port.Text = "连接失败:" + comboBox_Serial.Text;
                        toolStripStatus_Port.ForeColor = Color.Red; // 设置为红色
                        MessageBox.Show("串口连接失败!\r\n可能原因:串口被占用或没有可用串口", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
    
    
                }
                else
                {
                    serialPort1.Close();   // 关闭串口
    
                    // 设置按键的使用权限
                    comboBox_Serial.Enabled = true;
                    comboBox_BandRate.Enabled = true;
                    comboBox_Check.Enabled = true;
                    comboBox_Data.Enabled = true;
                    comboBox_Stop.Enabled = true;
                    button_Refresh.Enabled = true;
    
    
                    // 打开属性变为关闭属性
                    button_OK.Text = "打开串口";
                    toolStripStatus_Port.Text = "断开连接:" + comboBox_Serial.Text;
                    toolStripStatus_Port.ForeColor = Color.Red; // 设置为红色
    
                }
    
            }
    
    **2.刷新串口按钮点击事件**
     private void button_Refresh_Click(object sender, EventArgs e)
            {
                InitializeSerialSet(); // 刷新串口设置
            }
    

    3.原始串口数据显示

      /// <summary>
            /// 串口接收数据
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            public bool ReceiveData()
            {
    
                if (serialPort1 == null)
                {
                    return false;
                }
                if (serialPort1.IsOpen == false)
                {
                    return false;
                }
                if (serialPort1.BytesToRead <= 0)   // 串口中没有数据
                {
                    return false;
                }
                lock (thisLock)   // 锁住串口
                {
                    int len = serialPort1.BytesToRead;
                    byte[] data = new Byte[len];
                    try
                    {
                        serialPort1.Read(data, 0, len);   // 向串口中读取数据
                    }
                    catch (Exception)
                    {
                        MessageBox.Show("数据接收失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return false;
                    }
    
    
                    SerialPortEventArgs args = new SerialPortEventArgs();
                    args.receivedBytes = data;
                  
                    if (comReceiveDataEvent != null)
                    {
                        comReceiveDataEvent.Invoke(this, args);
                    }
    
                }
    
    
                return true;
            }
            public void ComReceiveDataEvent(Object sender, SerialPortEventArgs e)
            {
    
                if (this.InvokeRequired)
                {
                    try
                    {
                        Invoke(new Action<Object, SerialPortEventArgs>(ComReceiveDataEvent), sender, e);
                    }
                    catch (Exception)
                    {
    
                    }
                    return;
                }
    
    
                if (richTextBox_Receive.Text.Length > 0)
                {
                    richTextBox_Receive.AppendText(" ");  // 中间使用 隔开,也可以使用-隔开
                }
          
                richTextBox_Receive.AppendText(System.Text.Encoding.Default.GetString(e.receivedBytes));
                gpsinformation = System.Text.Encoding.Default.GetString(e.receivedBytes).ToString();
               
                GPSdata(gpsinformation);
       
                // 更新状态显示框
                receCount += e.receivedBytes.Length;
                toolStripStatus_recestatus.Text = "收到数据: " + receCount.ToString();
    
            }
    

    第二部分:解析接收的GPS数据

      /// <summary>
            /// 解析GPS数据方法
            /// </summary>
          
            private void GPSdata(string str)
            {
    
                string[] dataSplit = str.Split(new char[] { ',', '*' });
                string Protocol = dataSplit[0];
                if (Protocol == "$GPRMC")
                    //有效字段GPRMC
                {
                string sDay= dataSplit[9].Substring(0, 2);
               
                string sMouth = dataSplit[9].Substring(2, 2);
                string sYear = dataSplit[9].Substring(4, 2);
                string sTimeHour = dataSplit[1].Substring(0, 2);
                int usatime = int.Parse(sTimeHour)+8;
            
                if (usatime/24>=1)
                {
                    int ssDay = int.Parse(sDay) + 1;
                    sDay = ssDay.ToString();
                }
               
                sTimeHour = (usatime%24).ToString();
                
                string sTimeMinute = dataSplit[1].Substring(2, 2);
                string sTimeSecond = dataSplit[1].Substring(4, 2);
                String sTime;
    
                sTime =sYear+"/"+sMouth+"/"+sDay+"/"+sTimeHour + ":" + sTimeMinute + ":" + sTimeSecond;          
               
                string sLatitude = dataSplit[3].Substring(0, 2)+"."+ dataSplit[3].Substring(2,2)+dataSplit[3].Substring(5,4);              
                string sLongitude=dataSplit[5].Substring(0,3)+"."+dataSplit[5].Substring(3,2)+dataSplit[5].Substring(6,4);
                          
                dataGridView1.Rows.Add(sTime,sLongitude, sLatitude);
                
                }
                else
                { return;
                }
               
            }
    

    第三部分:保存接收的GPS数据为excel格式

    自动保存使用timer定时器,手动保存直接调用方法
    自动保存保存在c盘文档目录下

      private void excelsave(object sender, EventArgs e)
            {
                if (atuosave.Checked)
                {
                    int datastr = dataGridView1.RowCount;
                    if (datastr <=1)
                    {
                        return;
                    }
                    timerSend.Interval = int.Parse(savetime.Text)*60000;  // 将字符串转化为整型数字
                    if (serialPort1.IsOpen == true)
                    {
    
                   dataGridViewToCSV1(dataGridView1);
                    }
                    
              
                }
    
               
            }
             private bool dataGridViewToCSV1(DataGridView dataGridView)
            {
                if (dataGridView.Rows.Count == 0)
                {
                    MessageBox.Show("没有数据可导出!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return false;
                }
                SaveFileDialog saveFileDialog = new SaveFileDialog();
                saveFileDialog.Filter = "CSV files (*.csv)|*.csv";
                saveFileDialog.FilterIndex = 0;
    
                saveFileDialog.RestoreDirectory = true;
                saveFileDialog.CreatePrompt = true;
                //saveFileDialog.FileName = null;
                saveFileDialog.Title = "保存";
                saveFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);   // 获取文件路径
              
                saveFileDialog.FileName = saveFileDialog.InitialDirectory + "\\"+"ce.csv";
                
                    Stream stream = saveFileDialog.OpenFile();
                    StreamWriter sw = new StreamWriter(stream, System.Text.Encoding.GetEncoding(-0));
                    string strLine = "";
                    try
                    {
                        //表头
                        for (int i = 0; i < dataGridView.ColumnCount; i++)
                        {
                            if (i > 0)
                                strLine += ",";
                            strLine += dataGridView.Columns[i].HeaderText;
                        }
                        strLine.Remove(strLine.Length - 1);
                        sw.WriteLine(strLine);
                        strLine = "";
                        //表的内容
                        for (int j = 0; j < dataGridView.Rows.Count; j++)
                        {
                            strLine = "";
                            int colCount = dataGridView.Columns.Count;
                            for (int k = 0; k < colCount; k++)
                            {
                                if (k > 0 && k < colCount)
                                    strLine += ",";
                                if (dataGridView.Rows[j].Cells[k].Value == null)
                                    strLine += "";
                                else
                                {
                                    string cell = dataGridView.Rows[j].Cells[k].Value.ToString().Trim();
                                    //防止里面含有特殊符号
                                    cell = cell.Replace("\"", "\"\"");
                                    cell = "\"" + cell + "\"";
                                    strLine += cell;
                                }
                            }
                            sw.WriteLine(strLine);
                        }
                        sw.Close();
                        stream.Close();
                       // MessageBox.Show("数据被导出到:" + saveFileDialog.FileName.ToString(), "导出完毕", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "导出错误", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return false;
                    }
                
                return true;
            }
    

    欢迎留言一起学习

    展开全文
  • ​ 软件主要功能是接收GPS发送的数据,进行解析处理然后显示出来。本人用的数据格式不同于以下任何一种: GPGSV:可见卫星信息 GPGLL:地理定位信息 GPRMC:推荐最小定位信息 GPVTG:地面速度信息 GPGGA:GPS定位...
  • GPS模块型号: 中科微电子ATGM336H-5N 系列模块 ATGM336H-5N 系列模块是 9.7X10.1 尺寸的高性能 BDS/GNSS 全星座定位导航模块系列的总称。该系列模块产品都是基于中科微第四代低功耗 GNSS SOC 单芯片—AT6558,支持...
  • 嵌入式 ATK-S1216 GPS + 北斗定位模块。 资料包里包含ATK-S1216F8-BD模块原理图、程序源码、配套软件、模块使用说明、S1218F8-BD相关资料等详细材料,适合stm32或51单片机嵌入式开发 北斗定位 GPS定位 嵌入式
  • 移远物联网4G模块MC20/EC20调试上位机
  • uSTAR 和芯星通的GPS/北斗上位机。 通过串口接收定位数据,解析协议,显示卫星信息,显示地图定位
  • 专业课程要求,在SEED-DEC6713开发板上实现实时的单点定位程序解算,将结果以自定义格式...然后,开发一个类似于串口助手的PC上位机软件,用于从串口接收开发板输出的导航定位结果,并完成数据解码和定位结果显示界面。
  • QT开发 ROS上位机界面

    2021-05-16 02:38:28
    前言最近在给ROS机器人做上位机界面,因为有点C++的基础,也就选择了绿油油的QT来做。作为刚入门的小白,单单是配环境就折磨了我好几天(半路出家,好多坑得爬),做点笔记,但愿以后别重新踩坑,也希望能对大家有所...
  • 基于QT编写的GPS上位机软件,已增加注释,个人认为比较详细,有界面,很适合初学者,界面功能还算比较完善,包含时间,日期,经纬度,卫星等各种内容,推荐。
  • 1.GPS用的瑞士 UBLOX LEA 模块,因为是自己做着玩,就从网上选择了便宜的GPRS模块 二手的台湾BENQ M22 2.另外自己做了个串口数据监控小板,可以从此板上将UART口相互发送的数据直接用电脑串口数据监控。用来测试自己...
  • 内嵌Google Earth就是将Google Earth的三维卫星地图的显示窗口挂钩于本设计软件的窗体中,以实现GPS、GPRS和Google Earth的一体化集成,进而实现了卫星地图的GPS定位导航。 外挂Google Earth是通过将软件外挂在...
  • #include "mainwindow.h"#include "ui_mainwindow.h"#includeMainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(newUi::MainWindow){ui->setupUi(this);Pic = tr("://Resource/关灯.jpg");...
  • 基于正点原子stm32改写的gps定位程序和用labview编写的上位机接收定位信息,功能有待完善。
  • 基于C3-370C的GPS定位及轨迹记录仪! 开始用M48作控制MCU,结果写着写着,发现Flash空间不足,想换个M8或M88的,还不好买,手上正好还有两块STC90C52,8K的,于是就换上C52了。C52不带AD,那电池检测又成问题,于是...
  • 使用Java语言开发一个高质量和高性能的jt808协议的GPS通信服务器,并不是一件简单容易的事情,开发出来一段程序和能够承受数十万台车载接入是两码事,除去开发部标jt808协议的固有复杂性和几个月长周期的协议Bug调试...
  • 电子政务-用于GPS设备与上位机之间的串口调试电路.zip
  • qt编写的GPS界面

    2018-03-20 10:46:27
    GPS获取的数据可以在界面上显示,并且有界面对定位的位置进行显示。
  • //调用javascritpt函数标注地图 WebBrowser mapWB = (WebBrowser)baiDuMap.Content; mapWB.InvokeScript("theLocation", new object[] { DegreeConvert(gpsInfo.lon) , De...
  • Google地球上位机

    2014-08-08 18:51:46
    基于gps上位机,在使用时,应该打开对应的串口
  • 基于Qt的GPS导航系统

    千次阅读 2010-12-20 23:59:00
    文字显示和颜色显示还没完善,虽然还很粗糙,但是基本显示功能实现了。 ARM9下测试启动到显示地图用时小于3s 缩放用时小于1s,无明显延迟。 地图使用天津市地图shapefile文件格式
  • 和芯星通上位机软件,用于gps模块配置,保存参数,查看卫星颗数,卫星信号信噪比,设置波特率,设置输出语句,设置输出速率,查看定位坐标
  • 车载定位监控系统上位机,可以用于接受设备发来的GPS位置进行 定位标记显示。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 861
精华内容 344
关键字:

gps上位机