📄 gpspet.cs
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;
using System.Threading;
namespace GPSPet
{
public partial class GPSPet : Form
{
//StreamReader sr = System.IO.File.OpenText("program files\\0.txt");
#region 声明
private SerialPort _ComPort = new SerialPort("COM1", 4800); //初始化端口
#region 声明类的实例
NmeaParser _Interpreter = new NmeaParser();
GpsParam _Setting = null;
NMEA2OSG _OSGconv = new NMEA2OSG();
#endregion
public int _WriteTime;
public string _SaveTrace;
public string[] _GpsString;
public string _InString;
public string[] _Nrthest;
public double _EllipHeight;
public int _TraceInterval; //轨迹记录间隔
public string _TracePath; //轨迹存放路径
public int _ScreenInterval; //屏幕刷新间隔
public int _ScreenTraceInterval; //屏幕轨迹记录间隔
public string _YN; //自动检测(Y/N)
public int _BaudRate; //波特率
public string _PortName; //通讯端口
public string _SafeSpeedFile; //安全速度声音文件
public string _HighSpeedFile; //高速告警声音文件
public string _OverSpeedFile; //超速报警声音文件
public int _SafeSpeed; //安全
public int _HighSpeed; //高速
public int _OverSpeed; //超速
//绘制活动卫星所需变量
public Bitmap imgSignals = new Bitmap(240, 204);
bool[] display = new bool[33];
int[] XX = new int[33];
int[] YY = new int[33];
SolidBrush[] brush = new SolidBrush[33];
//显示轨迹所需变量
public Bitmap imgtrace = new Bitmap(225,216);
bool IsTwoPoints = false;
Point[] points = new Point[2];
#endregion;
public GPSPet()
{
InitializeComponent();
label_time.Text = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
pictureBox_ActiveSate.Invalidate();
_ComPort.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); //处理SerialPort对象的数据接受
_Interpreter.PositionReceived += new NmeaParser.PositionReceivedEventHandler(GPS_PositionReceived);
_Interpreter.DateTimeChanged += new NmeaParser.DateTimeChangedEventHandler(GPS_DateTimeChanged);
_Interpreter.SatellitesInViewReceived += new NmeaParser.SatellitesInViewReceivedEventHandler(GPS_SatellitesInViewReceived);
_Interpreter.SatelliteReceived += new NmeaParser.SatelliteReceivedEventHandler(GPS_SatelliteReceived);
_Interpreter.SpeedReceived += new NmeaParser.SpeedReceivedEventHandler(GPS_SpeedReceived);
_Interpreter.BearingReceived += new NmeaParser.BearingReceivedEventHandler(GPS_BearingReceived);
_Interpreter.HDOPReceived += new NmeaParser.HDOPReceivedEventHandler(GPS_HDOPReceived);
_Interpreter.VDOPReceived += new NmeaParser.VDOPReceivedEventHandler(GPS_VDOPReceived);
_Interpreter.EllipsoidHeightReceived += new NmeaParser.EllipsoidHeightReceivedEventHandler(GPS_EllipsoidHeightReceived);
_Interpreter.PDOPReceived += new NmeaParser.PDOPReceivedEventHandler(GPS_PDOPReceived);
_Interpreter.Mode += new NmeaParser.ModeEventHandler(GPS_Mode);
_Interpreter.CurrentState += new NmeaParser.CurrentStateEventHandler(GPS_CurrentState);
}
/// <summary>
/// 在第一次显示窗体前发生
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void GPS_Load(object sender, System.EventArgs e)
{
DataSet ds = new DataSet();
//string path= System.IO.Path.GetDirectoryName
//(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\config.xml";
string path = "program files\\config.xml";
if (System.IO.File.Exists(path))
{
ds.ReadXml(path);
DataTable aa = ds.Tables["轨迹记录设置"];
foreach (DataRow row in aa.Rows)
{
_TraceInterval = int.Parse(row["轨迹记录间隔"].ToString());
_TracePath = row["轨迹存放路径"].ToString();
}
DataTable bb = ds.Tables["时间间隔设置"];
foreach (DataRow row in bb.Rows)
{
_ScreenInterval = int.Parse(row["屏幕刷新间隔"].ToString());
_ScreenTraceInterval = int.Parse(row["屏幕轨迹记录间隔"].ToString());
}
DataTable cc = ds.Tables["GPS设置"];
foreach (DataRow row in cc.Rows)
{
_YN = row["自动检测"].ToString();
_BaudRate = int.Parse(row["波特率"].ToString());
_PortName = row["通讯端口"].ToString();
}
DataTable dd = ds.Tables["声音设置"];
foreach (DataRow row in dd.Rows)
{
_SafeSpeedFile = row["安全速度声音文件"].ToString();
_HighSpeedFile = row["高速告警声音文件"].ToString();
_OverSpeedFile = row["超速报警声音文件"].ToString();
}
DataTable ee = ds.Tables["速度设置"];
foreach (DataRow row in ee.Rows)
{
_SafeSpeed = int.Parse(row["安全"].ToString());
_HighSpeed = int.Parse(row["高速"].ToString());
_OverSpeed = int.Parse(row["超速"].ToString());
}
}
else
{
MessageBox.Show("转入页面后,请先在菜单中设置GPS");
menu_link.Enabled = false;
return;
}
}
#region serialport
/// <summary>
/// 处理SerialPort对象的数据接受
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
this.Invoke(new EventHandler(HandleGPSstring));
}
/// <summary>
///读取 SerialPort 对象的流和输入缓冲区中所有立即可用的字节,调用类NmeaInterpreter进行解析
/// </summary>
/// <param name="s"></param>
/// <param name="e"></param>
private void HandleGPSstring(object s, EventArgs e)
{
if (_ComPort == null)
return;
string inbuff;
inbuff = _ComPort.ReadExisting(); //读取 SerialPort 对象的流和输入缓冲区中所有立即可用的字节
if (inbuff != null)
{
_Interpreter.Parse(inbuff);
if (inbuff.StartsWith("$"))
{
_InString = inbuff;
}
else
{
_InString += inbuff;
}
_GpsString = _InString.Split();
foreach (string item in _GpsString)
_Interpreter.Parse(item);//调用类NmeaInterpreter的方法Parse
}
}
private void timer1_Tick(object sender, EventArgs e)
{
this.timer1.Interval = _TraceInterval * 1000;
_SaveTrace += _InString;
_WriteTime += _TraceInterval;
if (_WriteTime >= 10)
{
StreamWriter sw = new StreamWriter(_TracePath, true);
sw.WriteLine(_SaveTrace);
sw.Close();
_SaveTrace = null;
_WriteTime = 0;
}
}
#endregion
#region GPS data parser
/// <summary>
/// 显示经度,纬度
/// </summary>
/// <param name="Lat"></param>
/// <param name="Lon"></param>
private void GPS_PositionReceived(string Lat, string Lon) //显示纬度,经度
{
//将用世界大地坐标系获取的值进行转换
//display decimal values of lat and lon
double iLat = double.Parse(Lat);
double iLon = double.Parse(Lon);
int dd_lat = (int)(iLat / 100);
int ff_lat = (int)(iLat - dd_lat * 100);
int mm_lat = (int)((iLat - dd_lat * 100 - ff_lat) * 60);
int dd_lon = (int)(iLon / 100);
int ff_lon = (int)(iLon - dd_lon * 100);
int mm_lon = (int)((iLon - dd_lon * 100 - ff_lon) * 60);
label_lat.Text = Convert.ToString(dd_lat) + "°" + Convert.ToString(ff_lat) + "′" + Convert.ToString(mm_lat) + "″";
label_lon.Text = Convert.ToString(dd_lon) + "°" + Convert.ToString(ff_lon) + "′" + Convert.ToString(mm_lon) + "″";
//if (_OSGconv.ParseNMEA(Lat, Lon, _EllipHeight))
//{
// //display decimal values of lat and lon
// int dd_lat = (int)(_OSGconv.deciLat);
// int ff_lat = (int)((_OSGconv.deciLat - dd_lat) * 60);
// int mm_lat = (int)(((_OSGconv.deciLat - dd_lat) * 60 - ff_lat) * 60);
// int hm_lat = (int)((((_OSGconv.deciLat - dd_lat) * 60 - ff_lat) * 60-mm_lat)*60);
// int dd_lon = (int)(_OSGconv.deciLon);
// int ff_lon = (int)((_OSGconv.deciLon - dd_lon) * 60);
// int mm_lon = (int)(((_OSGconv.deciLon - dd_lon) * 60 - ff_lon) * 60);
// int hm_lon = (int)((((_OSGconv.deciLon - dd_lon) * 60 - ff_lon) * 60 - mm_lon) * 60);
// label_lat.Text = Convert.ToString(dd_lat) + "°" + Convert.ToString(ff_lat) + "′" + Convert.ToString(mm_lat) + "″" + Convert.ToString(hm_lat);
// label_lon.Text = Convert.ToString(dd_lon) + "°" + Convert.ToString(ff_lon) + "′" + Convert.ToString(mm_lon) + "″" + Convert.ToString(hm_lon);
//}
//记录轨迹
string sx = Lon.Substring(3);
string sy = Lat.Substring(2);
double mapX = Convert.ToDouble(sx);
double mapY = Convert.ToDouble(sy);
double minx = 0.0;
double maxx = imgtrace.Width;
double miny = 0.0;
double maxy = imgtrace.Height;
double minmapx = ff_lon;
double maxmapx = ff_lon+1;
double minmapy = ff_lat;
double maxmapy = ff_lat+1;
Graphics g = Graphics.FromImage(imgtrace);
SolidBrush brush = new SolidBrush(Color.Red);
Pen pen = new Pen(Color.Red);
int imageX = Convert.ToInt32((mapX - minmapx) / (maxmapx - minmapx) * (maxx - minx) + minx);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -