GPS接收機(七)基於C#的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);
                    }
                }
            }
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章