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