⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gpspet.cs

📁 嵌入式终端的gps定位程序
💻 CS
📖 第 1 页 / 共 3 页
字号:
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 + -