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);
}
}
}
}
}