Newer
Older
RbFreqStand / RbFreqStandMeasure / home / HomeCtrlForm.cs
yangqianqian on 1 Apr 2021 29 KB ui almost
using Casic.Birmm.RbFreqStandMeasure.home;
using Casic.Birmm.RbFreqStandMeasure.R_DataBase.Dto;
using Casic.Birmm.RbFreqStandMeasure.R_DataBase.Model;
using Casic.Birmm.RbFreqStandMeasure.R_DataBase.Service;
using Casic.Birmm.RbFreqStandMeasure.R_DataBase.Service.Impl;
using Casic.Birmm.RbFreqStandMeasure.tools;
using Casic.Birmm.RbFreqStandMeasure.Tools;
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Timers;
using System.Windows.Forms;

namespace Casic.Birmm.RbFreqStandMeasure
{
    public partial class HomeCtrlForm : UserControl
    {
        int totalCount = 0;
        int currentPage = 1;
        int pageCount = 0;
        int limitCount = 4;
        DataTable devToBeTestedTable = null;
        DataTable channelsTable = null;
        DeviceService deviceService = new DeviceServiceImpl();

        private string[] portNames = null;
        private List<SerialPort> serialPorts;
        private byte[] portBuffer;


        System.Timers.Timer timerPort; //计时器,每1s中读取一次串口数据
       

        #region 样式常量定影
        private readonly Color titleBackColor = Color.FromArgb(63, 132, 215); // #3F84D7
        private readonly Font titleFont = new Font("微软雅黑", 14F, FontStyle.Regular, GraphicsUnit.Pixel, 134);
        #endregion
        
        public HomeCtrlForm()
        {
            InitializeComponent();
            
        }

        private void HomeCtrlForm_Load(object sender, EventArgs e)
        {
            // 初始化表格标题栏
            InitTableDevList();

            // 加载待检测列表
            LoadDevToBeTested();

            // 初始化各通道样式
            InitTableChannel();
            LoadChannelStatus();

            pic_stability_1.BackColor = Color.FromArgb(201, 203, 208);
            pic_accuracy_1.BackColor = Color.FromArgb(201, 203, 208);
            pic_bootFeature_1.BackColor = Color.FromArgb(201, 203, 208);
            pic_ageRate_1.BackColor = Color.FromArgb(201, 203, 208);
        }

        #region 待测仪器列表
        private void InitTableDevList()
        {
            tableToBeTested.Columns.Clear();
            tableToBeTested.Rows.Clear();

            // 添加标题栏
            Panel tableHeader = new Panel
            {
                BackColor = Color.White,
                Size = new Size(764, 32),
                Location = new Point(0, 0)
            };
            tableHeader.BackColor = titleBackColor;
            tableToBeTested.Controls.Add(tableHeader);

            // 仪器名称
            Label colDevName = new Label
            {
                Font = titleFont,
                ForeColor = Color.White,
                TextAlign = ContentAlignment.MiddleCenter,
                BackColor = titleBackColor,
                AutoSize = false,
                Text = "仪器名称",
                Location = new Point(0, 0),
                Size = new Size(100, 32)
            };
            tableToBeTested.Controls.Add(colDevName);
            colDevName.BringToFront();

            // 仪器类型
            Label colDevType = new Label
            {
                Font = titleFont,
                ForeColor = Color.White,
                TextAlign = ContentAlignment.MiddleCenter,
                BackColor = titleBackColor,
                AutoSize = false,
                Text = "仪器类型",
                Location = new Point(100, 0),
                Size = new Size(100, 32)
            };
            tableToBeTested.Controls.Add(colDevType);
            colDevType.BringToFront();

            // 仪器编号
            Label colDevNo = new Label
            {
                Font = titleFont,
                ForeColor = Color.White,
                TextAlign = ContentAlignment.MiddleCenter,
                BackColor = titleBackColor,
                AutoSize = false,
                Text = "仪器编号",
                Location = new Point(200, 0),
                Size = new Size(100, 32)
            };
            tableToBeTested.Controls.Add(colDevNo);
            colDevNo.BringToFront();

            // 客户名称
            Label colCustomName = new Label
            {
                Font = titleFont,
                ForeColor = Color.White,
                TextAlign = ContentAlignment.MiddleCenter,
                BackColor = titleBackColor,
                AutoSize = false,
                Text = "客户名称",
                Location = new Point(300, 0),
                Size = new Size(100, 32)
            };
            tableToBeTested.Controls.Add(colCustomName);
            colCustomName.BringToFront();

            // 客户单位
            Label colCustomComp = new Label
            {
                Font = titleFont,
                ForeColor = Color.White,
                TextAlign = ContentAlignment.MiddleCenter,
                BackColor = titleBackColor,
                AutoSize = false,
                Text = "客户单位",
                Location = new Point(400, 0),
                Size = new Size(120, 32)
            };
            tableToBeTested.Controls.Add(colCustomComp);
            colCustomComp.BringToFront();

            // 开始时间
            Label colStartTime = new Label
            {
                Font = titleFont,
                ForeColor = Color.White,
                TextAlign = ContentAlignment.MiddleCenter,
                BackColor = titleBackColor,
                AutoSize = false,
                Text = "开始时间",
                Location = new Point(520, 0),
                Size = new Size(144, 32)
            };
            tableToBeTested.Controls.Add(colStartTime);
            colStartTime.BringToFront();

            // 通道号
            Label colChannelNo = new Label
            {
                Font = titleFont,
                ForeColor = Color.White,
                TextAlign = ContentAlignment.MiddleCenter,
                BackColor = titleBackColor,
                AutoSize = false,
                Text = "通道号",
                Location = new Point(664, 0),
                Size = new Size(100, 32)
            };
            tableToBeTested.Controls.Add(colChannelNo);
            colChannelNo.BringToFront();

            totalCount = 0;
            currentPage = 1;
            pageCount = 0;
            limitCount = 4;
            devToBeTestedTable = new DataTable();
            devToBeTestedTable.Columns.Add("id", Type.GetType("System.String"));
            devToBeTestedTable.Columns.Add("devName", Type.GetType("System.String"));
            devToBeTestedTable.Columns.Add("devTypeName", Type.GetType("System.String"));
            devToBeTestedTable.Columns.Add("devCode", Type.GetType("System.String"));
            devToBeTestedTable.Columns.Add("customerName", Type.GetType("System.String"));
            devToBeTestedTable.Columns.Add("customerDev", Type.GetType("System.String"));
            devToBeTestedTable.Columns.Add("startTime", Type.GetType("System.String"));
            devToBeTestedTable.Columns.Add("channelNo", Type.GetType("System.String"));
        }
        private void LoadDevToBeTested()
        {
            devToBeTestedTable.Rows.Clear();
            // 获取数据
            // 获取待检测设备的总条数
            totalCount = deviceService.getTotalCount("", "", "", "", "", "1");

            // 获取当前页的数据
            List<DeviceDto> queryList = deviceService.searchPage("", "", "", "", "", "1", currentPage, limitCount);
            if (null != queryList && queryList.Count > 0)
            {
                // 重新计算页码数据
                pageCount = totalCount / limitCount;
                int ys = totalCount % limitCount;
                if (ys != 0)
                    pageCount++;
                setPageLabel();


                //devToBeTested = DataHelper.ConvertToDataTable<DeviceDto>(queryList);
                //int i = 0;
                foreach (DeviceDto device in queryList)
                {
                    //int index = (currentPage - 1) * limitCount + i + 1;
                    devToBeTestedTable.Rows.Add(device.Id, device.DevName, device.DevTypeName, device.DevCode, device.CustomerName, device.CustomerDev, "", device.Channel);
                    //i++;
                }
                //tableToBeTested.Columns[0].Visible = false;
                //tableToBeTested.Columns[0].Visible = false;

                tableToBeTested.Visible = true;
                labelNodata.Visible = false;

                tableToBeTested.DataSource = devToBeTestedTable;

                tableToBeTested.Columns[0].Visible = false;
                // width=984px
                tableToBeTested.Columns[1].Width = 100;
                tableToBeTested.Columns[2].Width = 100;
                tableToBeTested.Columns[3].Width = 100;
                tableToBeTested.Columns[4].Width = 100;
                tableToBeTested.Columns[5].Width = 120;
                tableToBeTested.Columns[6].Width = 144;
                tableToBeTested.Columns[7].Width = 100;

                tableToBeTested.Columns[0].ReadOnly = true;
                tableToBeTested.Columns[1].ReadOnly = true;
                tableToBeTested.Columns[2].ReadOnly = true;
                tableToBeTested.Columns[3].ReadOnly = true;
                tableToBeTested.Columns[4].ReadOnly = true;
                tableToBeTested.Columns[5].ReadOnly = true;
                tableToBeTested.Columns[6].ReadOnly = true;
                tableToBeTested.Columns[7].ReadOnly = true;


            }
            else
            {
                tableToBeTested.Visible = false;
                labelNodata.Visible = true;
            }





            //devToBeTested.Rows.Add("SF2001-1", "通用计数器", "00001", "203", "203", DateTime.Now);
            //devToBeTested.Rows.Add("SF2001-2", "通用计数器", "00001", "203", "203", DateTime.Now);
            //devToBeTested.Rows.Add("SF2001-3", "通用计数器", "00001", "203", "203", DateTime.Now);
            //devToBeTested.Rows.Add("SF2001-4", "通用计数器", "00001", "203", "203", DateTime.Now);

        }

        private void tableToBeTested_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            int rowIndex = tableToBeTested.CurrentCell.RowIndex;
            int colIndex = tableToBeTested.CurrentCell.ColumnIndex;


            SetDevTestDlg devTestDlg = new SetDevTestDlg();
            devTestDlg.text_customerDev.Text = tableToBeTested.Rows[rowIndex].Cells[5].Value.ToString();
            devTestDlg.text_devName.Text = tableToBeTested.Rows[rowIndex].Cells[1].Value.ToString();
            devTestDlg.text_devCode.Text = tableToBeTested.Rows[rowIndex].Cells[3].Value.ToString();
            devTestDlg.text_customerName.Text = tableToBeTested.Rows[rowIndex].Cells[4].Value.ToString();
            devTestDlg.text_devType.Text = tableToBeTested.Rows[rowIndex].Cells[2].Value.ToString();
            if (tableToBeTested.Rows[rowIndex].Cells[6].Value.ToString() != "") devTestDlg.timePicker_startTime.Value = Convert.ToDateTime(tableToBeTested.Rows[rowIndex].Cells[6].Value.ToString());

            devTestDlg.HideMaskAction += () =>
            {
                this.HideMask();
            };
            this.ShowMask();
            devTestDlg.StartPosition = FormStartPosition.CenterParent; // 指定窗口弹出在父窗口的中间位置
            devTestDlg.ShowDialog();

        }

        private void setPageLabel()
        {
            label_pageInfo.Text = "共" + totalCount + "条,每页" + limitCount + "条,共" + pageCount + "页";
            textBoxPage.Text = currentPage.ToString();
        }

        private void btnPre_Click(object sender, EventArgs e)
        {
            if (Convert.ToInt16(textBoxPage.Text) > 1)
            {
                currentPage = Convert.ToInt16(textBoxPage.Text) - 1;
                LoadDevToBeTested();
            }
        }

        private void btnNext_Click(object sender, EventArgs e)
        {
            if (Convert.ToInt16(textBoxPage.Text) < pageCount)
            {
                currentPage = Convert.ToInt16(textBoxPage.Text) + 1;
                LoadDevToBeTested();
            }
        }
        #endregion



        #region 通道列表

        private void InitTableChannel()
        {
            dataGridView_Channel.Columns.Clear();
            dataGridView_Channel.Rows.Clear();

            // 添加标题栏
            Panel tableHeader = new Panel
            {
                BackColor = Color.White,
                Size = new Size(984, 30),
                Location = new Point(0, 0)
            };
            tableHeader.BackColor = titleBackColor;
            dataGridView_Channel.Controls.Add(tableHeader);

            // 通道号
            Label colChannelNo = new Label
            {
                Font = titleFont,
                ForeColor = Color.White,
                TextAlign = ContentAlignment.MiddleCenter,
                BackColor = titleBackColor,
                AutoSize = false,
                Text = "通道号",
                Location = new Point(0, 0),
                Size = new Size(50, 30)
            };
            dataGridView_Channel.Controls.Add(colChannelNo);
            colChannelNo.BringToFront();

            // 仪器名称
            Label colDevName = new Label
            {
                Font = titleFont,
                ForeColor = Color.White,
                TextAlign = ContentAlignment.MiddleCenter,
                BackColor = titleBackColor,
                AutoSize = false,
                Text = "仪器名称",
                Location = new Point(50, 0),
                Size = new Size(110, 30)
            };
            dataGridView_Channel.Controls.Add(colDevName);
            colDevName.BringToFront();

            // 仪器编号
            Label colDevNo = new Label
            {
                Font = titleFont,
                ForeColor = Color.White,
                TextAlign = ContentAlignment.MiddleCenter,
                BackColor = titleBackColor,
                AutoSize = false,
                Text = "仪器编号",
                Location = new Point(160, 0),
                Size = new Size(110, 30)
            };
            dataGridView_Channel.Controls.Add(colDevNo);
            colDevNo.BringToFront();

            // 客户名称
            Label colCustomName = new Label
            {
                Font = titleFont,
                ForeColor = Color.White,
                TextAlign = ContentAlignment.MiddleCenter,
                BackColor = titleBackColor,
                AutoSize = false,
                Text = "客户名称",
                Location = new Point(270, 0),
                Size = new Size(110, 30)
            };
            dataGridView_Channel.Controls.Add(colCustomName);
            colCustomName.BringToFront();

            // 开始时间
            Label colStartTime = new Label
            {
                Font = titleFont,
                ForeColor = Color.White,
                TextAlign = ContentAlignment.MiddleCenter,
                BackColor = titleBackColor,
                AutoSize = false,
                Text = "开始时间",
                Location = new Point(380, 0),
                Size = new Size(120, 30)
            };
            dataGridView_Channel.Controls.Add(colStartTime);
            colStartTime.BringToFront();

            // 结束时间
            Label colEndTime = new Label
            {
                Font = titleFont,
                ForeColor = Color.White,
                TextAlign = ContentAlignment.MiddleCenter,
                BackColor = titleBackColor,
                AutoSize = false,
                Text = "结束时间",
                Location = new Point(500, 0),
                Size = new Size(120, 30)
            };
            dataGridView_Channel.Controls.Add(colEndTime);
            colEndTime.BringToFront();

            // 状态
            Label colStatus = new Label
            {
                Font = titleFont,
                ForeColor = Color.White,
                TextAlign = ContentAlignment.MiddleCenter,
                BackColor = titleBackColor,
                AutoSize = false,
                Text = "状态",
                Location = new Point(620, 0),
                Size = new Size(64, 30)
            };
            dataGridView_Channel.Controls.Add(colStatus);
            colStatus.BringToFront();

            // 开机特性
            Label colStartup = new Label
            {
                Font = titleFont,
                ForeColor = Color.White,
                TextAlign = ContentAlignment.MiddleCenter,
                BackColor = titleBackColor,
                AutoSize = false,
                Text = "开机特性",
                Location = new Point(824, 0),
                Size = new Size(75, 30)
            };
            dataGridView_Channel.Controls.Add(colStartup);
            colStartup.BringToFront();

            // 频率稳定度
            Label colStablility = new Label
            {
                Font = titleFont,
                ForeColor = Color.White,
                TextAlign = ContentAlignment.MiddleCenter,
                BackColor = titleBackColor,
                AutoSize = false,
                Text = "稳定度",
                Location = new Point(684, 0),
                Size = new Size(75, 30)
            };
            dataGridView_Channel.Controls.Add(colStablility);
            colStablility.BringToFront();

            // 频率准确度
            Label colAccuracy = new Label
            {
                Font = titleFont,
                ForeColor = Color.White,
                TextAlign = ContentAlignment.MiddleCenter,
                BackColor = titleBackColor,
                AutoSize = false,
                Text = "准确度",
                Location = new Point(759, 0),
                Size = new Size(75, 30)
            };
            dataGridView_Channel.Controls.Add(colAccuracy);
            colAccuracy.BringToFront();

            

            // 日老化率
            Label colAgingRate = new Label
            {
                Font = titleFont,
                ForeColor = Color.White,
                TextAlign = ContentAlignment.MiddleCenter,
                BackColor = titleBackColor,
                AutoSize = false,
                Text = "日老化率",
                Location = new Point(899, 0),
                Size = new Size(75, 30)
            };
            dataGridView_Channel.Controls.Add(colAgingRate);
            colAgingRate.BringToFront();
        }       

        private void LoadChannelStatus()
        {
            channelsTable = new DataTable();

            channelsTable.Columns.Add("channelNo", Type.GetType("System.String"));
            channelsTable.Columns.Add("devName", Type.GetType("System.String"));
            channelsTable.Columns.Add("devNo", Type.GetType("System.String"));
            channelsTable.Columns.Add("customName", Type.GetType("System.String"));
            channelsTable.Columns.Add("startTime", Type.GetType("System.DateTime"));
            channelsTable.Columns.Add("endTime", Type.GetType("System.DateTime"));
            channelsTable.Columns.Add("channelStatus", Type.GetType("System.String"));
            channelsTable.Columns.Add("startup", Type.GetType("System.String"));
            channelsTable.Columns.Add("stablility", Type.GetType("System.String"));
            channelsTable.Columns.Add("accuracy", Type.GetType("System.String"));
            channelsTable.Columns.Add("agingRate", Type.GetType("System.String"));


            channelsTable.Rows.Add("1", "通用计数器", "00001", "航天203", DateTime.Now, DateTime.Now, "占用", "", "", "", "");
            channelsTable.Rows.Add("2", "通用计数器", "00002", "李涛", DateTime.Now, DateTime.Now, "占用", "", "", "", "");
            channelsTable.Rows.Add("3", "", "", "", null, null, "空闲", "", "", "", "");
            channelsTable.Rows.Add("4", "通用计数器", "00003", "航天203", DateTime.Now, DateTime.Now, "占用", "", "", "", "");
            channelsTable.Rows.Add("5", "通用计数器", "000016", "航天203", DateTime.Now, DateTime.Now, "占用", "", "", "", "");

            foreach (DataRow row in channelsTable.Rows)
            {
                //if()
            }

            dataGridView_Channel.DataSource = channelsTable;
            

            pic_accuracy_1.Image = (Image)Properties.Resources.dot_green;

            // width=764px
            dataGridView_Channel.Columns[0].Width = 50;
            dataGridView_Channel.Columns[1].Width = 110;
            dataGridView_Channel.Columns[2].Width = 110;
            dataGridView_Channel.Columns[3].Width = 110;
            dataGridView_Channel.Columns[4].Width = 120;
            dataGridView_Channel.Columns[5].Width = 120;
            dataGridView_Channel.Columns[6].Width = 64;
            dataGridView_Channel.Columns[7].Width = 75;
            dataGridView_Channel.Columns[8].Width = 75;
            dataGridView_Channel.Columns[9].Width = 75;
            dataGridView_Channel.Columns[10].Width = 75;

            dataGridView_Channel.Columns[0].ReadOnly = true;
            dataGridView_Channel.Columns[1].ReadOnly = true;
            dataGridView_Channel.Columns[2].ReadOnly = true;
            dataGridView_Channel.Columns[3].ReadOnly = true;
            dataGridView_Channel.Columns[4].ReadOnly = true;
            dataGridView_Channel.Columns[5].ReadOnly = true;
            dataGridView_Channel.Columns[6].ReadOnly = true;
            dataGridView_Channel.Columns[7].ReadOnly = true;
            dataGridView_Channel.Columns[8].ReadOnly = true;
            dataGridView_Channel.Columns[9].ReadOnly = true;
            dataGridView_Channel.Columns[10].ReadOnly = true;          

        }

        private void dataGridView_Channel_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
        {
            dataGridView_Channel.Rows[2].DefaultCellStyle.BackColor = Color.FromArgb(232, 234, 238);

        }


        private void tableChannel_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            int rowIndex = tableToBeTested.CurrentCell.RowIndex;
            int colIndex = tableToBeTested.CurrentCell.ColumnIndex;

            SetDevChannelDlg channelDlg = new SetDevChannelDlg(rowIndex+1);
            channelDlg.HideMaskAction += () =>
            {
                this.HideMask();
            };
            this.ShowMask();
            channelDlg.StartPosition = FormStartPosition.CenterParent; // 指定窗口弹出在父窗口的中间位置
            channelDlg.ShowDialog();
        }

        #endregion

        private MaskForm maskForm;

        private void ShowMask()
        {
            maskForm = new MaskForm(this.Parent.Parent.Location, this.Parent.Parent.Size);
            maskForm.Show();
        }

        private void HideMask()
        {
            if (maskForm != null)
            {
                maskForm.Close();
            }
        }



        SerialPort port = new SerialPort();
        private void portOpen()
        {
            try
            {
                // 搜索串口
                string[] names = SerialPort.GetPortNames();
                if (names.Length == 0)
                {
                    MessageBox.Show("没有搜索到串口!");
                    return;
                }
                // 设置串口参数
                port.PortName = names[0];
                port.BaudRate = 115200;
                port.Parity = Parity.None;
                port.DataBits = 8;
                port.StopBits = StopBits.One;
                port.Handshake = Handshake.None;
                port.ReadTimeout = -1;
                port.WriteTimeout = 3000;

                // 打开串口
                if (!port.IsOpen)
                {
                    port.Open();
                }
                if (port.IsOpen)
                {
                    // 开启接收串口数据线程
                    timerPort = new System.Timers.Timer();
                    timerPort.Interval = 1000; //设置计时器事件间隔执行时间
                    timerPort.Elapsed += new System.Timers.ElapsedEventHandler(PortReceiveData);
                    timerPort.Enabled = true;
                    timerPort.Start();
                    LogHelper.WriteInfoLog(MethodBase.GetCurrentMethod().DeclaringType, "开始接收串口数据");
                }
            }
            catch(Exception  ex)
            {
                MessageBox.Show("错误","打开串口失败!");
                LogHelper.WriteInfoLog(MethodBase.GetCurrentMethod().DeclaringType, "打开串口失败!"+ ex.Message);
            }
        }


        private void PortReceiveData(object sender, ElapsedEventArgs e)
        {
            // 原子钟数据存放区
            byte[] receivedClock = new byte[96];
            // 卫星信号存放区
            byte[] receivedGPS = new byte[1024];
            int offset = 0;
            int dataType = 0;
            int gsvTotal = 0; // GSV卫星数据的总条数
            bool clockEnd = false;
            bool gsvEnd = false;
            bool rmcEnd = false;
            while (true)
            {
                // 获取接收缓冲区长度
                int Readlen = port.BytesToRead;
                
                // 接收到数据
                if (Readlen > 0)
                {
                    byte[] buffer = new byte[Readlen];
                    // 接收数据到buffer里面
                    port.Read(buffer, 0, Readlen);

                    // 判断接收到的数据
                    string data = Encoding.ASCII.GetString(buffer);
                    if (data.StartsWith("$") && data.Length > 2)
                    {
                        // 原子钟信号
                        if (data.Substring(1).StartsWith("D") || data.Substring(1).StartsWith("A"))
                        {
                            dataType = 1;
                            Array.Copy(buffer, 0, receivedClock, offset, Readlen);                            
                        }                       
                        
                        offset = offset + Readlen;

                    }
                    // RMC卫星信号,用于获取卫星状态
                    if (data.Contains("RMC"))
                    {
                        dataType = 2;
                        Array.Copy(buffer, 0, receivedGPS, offset, Readlen);
                        offset = offset + Readlen;
                    }
                    // GSV卫星信号,用于展示时间、日期、画卫星图等
                    if (data.Contains("GSV") && data.Length > 7)
                    {
                        dataType = 3;
                        gsvTotal = Convert.ToInt32(data.Substring(7, 1));
                        Array.Copy(buffer, 0, receivedGPS, offset, Readlen);
                        offset = offset + Readlen;
                    }
                    if (dataType == 1)
                    {
                        // 原子钟信号接收完毕
                        if (offset == 96)
                        {
                            clockEnd = true;
                            dataType = 0;
                            break;
                        }

                        else
                        {
                            Array.Copy(buffer, 0, receivedClock, offset, Readlen);
                            offset = offset + Readlen;
                        }
                    }
                    if (dataType == 2)
                    {
                        Array.Copy(buffer, 0, receivedGPS, offset, Readlen);
                        offset = offset + Readlen;

                        // RMC信号接收完毕
                        if (data.EndsWith("\r\n"))
                        {
                            rmcEnd = true;
                            dataType = 0;
                            break;
                        }                      
                    }
                    if (dataType == 3)
                    {
                        Array.Copy(buffer, 0, receivedGPS, offset, Readlen);
                        offset = offset + Readlen;

                        // GSV信号接收完毕
                        if (gsvTotal == Convert.ToInt32(data.Substring(9, 1)))
                        {
                            gsvEnd = true;
                            dataType = 0;
                            break;
                        }
                    }

                }
            }

            new Thread(() =>
            {
                // 解析原子钟信号
                if (clockEnd)
                {
                    string dataClock = Encoding.ASCII.GetString(receivedClock);
                    switch (dataClock.Substring(50, 1))
                    {
                        case "1": label_clockStatus.Text = "预热"; break;
                        case "2": label_clockStatus.Text = "自由运行"; break;
                        case "3": label_clockStatus.Text = "捕获"; break;
                        case "4": label_clockStatus.Text = "快锁"; break;
                        case "5": label_clockStatus.Text = "慢锁"; break;
                        case "7": label_clockStatus.Text = "保持"; break;
                        default: break;
                    }
                }

                // 解析rmc信号
                if (rmcEnd)
                {
                    string dataGPS = Encoding.ASCII.GetString(receivedGPS);



                }

                // 解析gsv信号
                if (gsvEnd)
                {
                    string dataGPS = Encoding.ASCII.GetString(receivedGPS);



                }

            }).Start();
            
           
        }

      
    }
}