📄 mainfrom.cs
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using Microsoft.Practices.EnterpriseLibrary.Data;
using Microsoft.Practices.EnterpriseLibrary.Data.Sql;
using System.Data.Common;
using System.Collections;
namespace GPSSerialPortData
{
public partial class MainFrom : Form
{
private System.IO.Ports.SerialPort[] ports = null;
private bool IsShowData = false;
StringBuilder f_SB = new StringBuilder();
public MainFrom()
{
InitializeComponent();
}
private string newline()
{
return "\r\n";
}
/// <summary>
/// 打开串口并开始数据接收
/// </summary>
private void OpenPort()
{
for (int i = 0; i < SerialPortConfig.Ports.Count; i++)
{
try
{
ports[i].Open();
ports[i].DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(SPort_DataReceived);
tbPortState.Text += "串口" + ports[i].PortName + "已经打开" + newline();
}
catch
{
tbPortState.Text += "串口" + ports[i].PortName + "不存在或已占用" + newline();
}
}
}
/// <summary>
/// 停止数据接收并关闭串口
/// </summary>
private void ClosePort()
{
for (int i = 0; i < SerialPortConfig.Ports.Count; i++)
{
try
{
if (ports[i].IsOpen)
{
ports[i].DataReceived -= new System.IO.Ports.SerialDataReceivedEventHandler(SPort_DataReceived);
ports[i].Close();
}
tbPortState.Text += "串口" + ports[i].PortName + "已经关闭" + newline();
}
catch
{
tbPortState.Text += "串口" + ports[i].PortName + "不存在或已占用" + newline();
}
}
}
private void AddReceiveData(byte[] bytes)
{
lock (f_SB)
{
foreach (byte b in bytes)
{
if (b < 16)
{
f_SB.Append( "0"+Convert.ToString(b, 16).ToUpper());
}
else
{
f_SB.Append(Convert.ToString(b, 16).ToUpper());
}
}
}
}
BackgroundWorker f_BG = new BackgroundWorker();
private void bgWorkerAnalyze_DoWork(object sender, DoWorkEventArgs e)
{
while (true)
{
if (f_SB.Length < 58)
{
System.Threading.Thread.Sleep(200);
}
else
{
lock (f_SB)
{
while (f_SB.Length>=58)
{
if (f_SB.ToString().Substring(0,4).ToUpper() == "ACAC")
{
SaveGPSData(f_SB.ToString().Substring(0, 58));
f_SB.Remove(0, 58);
}
else
{
f_SB.Remove(0, 4);
}
}
}
}
}
}
void SPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
System.IO.Ports.SerialPort serialPort = (System.IO.Ports.SerialPort)sender;
//此处 在测试时不能够确定出发的次数 故做了长度判断当长度为0时 不予考虑
int len = serialPort.BytesToRead;
byte[] bs = new byte[len];
serialPort.Read(bs, 0, len);
if (len == 0)
{
return;
}
else
{
BackgroundWorker bgWorker = new BackgroundWorker();
bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
bgWorker.RunWorkerAsync(bs);
return;
}
}
private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
byte[] bs = (byte[])e.Argument;
AddReceiveData(bs);
}
delegate void ShowGPSDataCallback(string text);
private void ShowGPSData(string message)
{
if (tbView.InvokeRequired == true)
{
ShowGPSDataCallback callback = new ShowGPSDataCallback(ShowGPSData);
tbView.Invoke(callback, message);
}
else
{
tbView.Text += message;
}
}
private void SaveGPSData(string data)
{
GPSData gpsData = new GPSData();
#region 设置数据
/*获取编号*/
gpsData.Terminal_Id = Convert.ToInt32(data.Substring(10,2)+ data.Substring(12,2) +
data.Substring(14,2) + data.Substring(16,2));
/*获取时间*/
gpsData.AddTime = Convert.ToDateTime(
data.Substring(20, 2) + ":"
+ data.Substring(22, 2) + ":"
+ data.Substring(24, 2));
/*获取纬度*/
gpsData.OriginalLatitude = Convert.ToDouble(
data.Substring(26, 2) + data.Substring(28, 2)
+ "."
+ data.Substring(30, 2) + data.Substring(32, 2)
);
/*获取纬度*/
gpsData.Latitude = Convert.ToString(Math.Truncate(gpsData.OriginalLatitude / 100)) + "°" +
Convert.ToString(Math.Truncate(Math.IEEERemainder(gpsData.OriginalLatitude, 100))) + "′" +
Convert.ToString(
Math.Round(
(Math.IEEERemainder(gpsData.OriginalLatitude, 100) - Math.Truncate(Math.IEEERemainder(gpsData.OriginalLatitude, 100))) * 60, 0, MidpointRounding.AwayFromZero)
) + "″";
/*获取经度*/
gpsData.OriginalLongitude = Convert.ToDouble(
data.Substring(34, 2) + data.Substring(36, 2) + data.Substring(38, 2)
+ "." + data.Substring(40, 2)
+ data.Substring(42, 2)
);
gpsData.Longitude = Convert.ToString(Math.Truncate(gpsData.OriginalLongitude / 100)) + "°" +
Convert.ToString(Math.Truncate(Math.IEEERemainder(gpsData.OriginalLongitude, 100))) + "′" +
Convert.ToString(
Math.Round(
(Math.IEEERemainder(gpsData.OriginalLongitude, 100) - Math.Truncate(Math.IEEERemainder(gpsData.OriginalLongitude, 100))) * 60, 0, MidpointRounding.AwayFromZero)
) + "″";
/*获取高度*/
gpsData.Height = Convert.ToDouble(
data.Substring(44, 2) + data.Substring(46, 2)
+ "." + data.Substring(49, 1));
#endregion
switch (data.Substring(18, 2))
{
case "89":
if (IsShowData)
{
ShowGPSData(
"终端" + gpsData.Terminal_Id +
" 北纬" + gpsData.Latitude +
" 东经" + gpsData.Longitude+
" 海拔" + gpsData.Height.ToString() +
" 时间" + gpsData.AddTime.ToString("hh:mm:ss" + newline())
);
}
break;
case "4B":
ShowGPSData(gpsData.Terminal_Id + "时间设置成功" + newline());
return;
case "50":
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -