//打开端口按钮 private void Opencom_button_Click(object sender, EventArgs e) { Button btn = (Button)sender; bool a, b; a = CTSerialPort.SetSP(com_list.Text, bode_list.Text, data_box.Text, stop_box.Text); b = CTSerialPort.OpenSP(); if (a && b) { MessageBox.Show("打开成功"); //保存串口参数 controlconfig.AddOrModifyItem("portnum", com_list.Text); controlconfig.AddOrModifyItem("bodenum", bode_list.Text); controlconfig.AddOrModifyItem("datanum", data_box.Text); controlconfig.AddOrModifyItem("stopnum", stop_box.Text); if (btn.FindForm().IsMdiChild) { return; } this.Close(); Form_SP_Test form_sp_test = new Form_SP_Test(); form_sp_test.ShowDialog(); return; } return; }
//断开连接按钮 点击 private void SP_Close_Click(object sender, EventArgs e) { if (!IsSignIn()) { return; } CTSerialPort.CloseSP(); }
//读取并转换串口数据的线程 void ManageReadDataThread() { Console.WriteLine("开始接收数据线程"); int dataID = 1, oldID = 0; //定义通道一和二的数据ID变量 byte[] bt = new byte[200]; //定义接收数据的byte数组 string dateTime = ""; UInt16[] channel1 = new UInt16[50]; UInt16[] channel2 = new UInt16[50]; //cTMySql.CreateNewTable(tablename + "_channel1"); //cTMySql.CreateNewTable(tablename + "_channel2"); while (manageReadDataFlag) { //object lockthis = new object(); //lock (lockthis) //{ if (CTSerialPort.ReadSP(ref bt, ref dateTime, 200)) { for (int i = 0; i < 50; i++) { byte temp = 0; temp = bt[i * 4]; bt[i * 4] = bt[i * 4 + 1]; bt[i * 4 + 1] = temp; channel1[i] = BitConverter.ToUInt16(bt, i * 4); temp = bt[i * 4 + 2]; bt[i * 4 + 2] = bt[i * 4 + 3]; bt[i * 4 + 3] = temp; channel2[i] = BitConverter.ToUInt16(bt, i * 4 + 2); } list1.AddRange(channel1); list2.AddRange(channel2); textBox1.AppendText(string.Join(" ", channel1)); textBox2.AppendText(string.Join(" ", channel2)); cTMySql.InsertData2DSTable(tablename + "_channel1", dataID, dateTime.ToString(), ref channel1); cTMySql.InsertData2DSTable(tablename + "_channel2", dataID, dateTime.ToString(), ref channel2); //if (dataID - oldID >= 100) //{ // oldID = dataID; // cTMySql.AddOrUpdataTableFromDataset2Databass(tablename + "_channel1"); // cTMySql.AddOrUpdataTableFromDataset2Databass(tablename + "_channel2"); //} dataID += 50; } //} } manageReadDataFlag = false;//线程结束后将信号灯标志置为禁止 }
/// <summary> /// 开始按钮 点击 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ButtonStart_Click(object sender, EventArgs e) { //判断manageReadData线程是否在运行 //如果是,则直接return //如果不是,继续下边动作 if (manageReadDataFlag) { MessageBox.Show("already start!"); return; } if (CTSerialPort.SetSP() && CTSerialPort.OpenSP()) //判断串口是否能开启 { tablename = DateTime.Now.ToString(); //定义内存表名时间前缀 cTMySql.CreateDSTable(tablename + "_channel1"); //创建内存表 cTMySql.CreateDSTable(tablename + "_channel2"); //创建内存表 CTSerialPort.SendSP("E"); Thread.Sleep(10); CTSerialPort.ClearInBuffer(); manageReadDataFlag = true; //线程红绿灯信号 通过 Thread mrd = new Thread(ManageReadDataThread); //实例化ManageReadData线程 mrd.IsBackground = true; //设为后台线程 mrd.Start(); //线程开始 CTSerialPort.SendSP("A"); //给下位机发送开始信号 //波形1绘制线程 reflashWave1ThreadFlag = true; Thread rfwave1 = new Thread(ReflashWave1Thread); rfwave1.IsBackground = true; rfwave1.Start(tablename + "_channel1"); //波形2绘制线程 reflashWave2ThreadFlag = true; Thread rfwave2 = new Thread(ReflashWave2Thread); rfwave2.IsBackground = true; rfwave2.Start(tablename + "_channel2"); Console.WriteLine("开始接收数据"); ButtonStop.Enabled = true; ButtonStart.Enabled = false; } else { MessageBox.Show("串口通信参数有误,请重新设置"); } }
//控件刷新 void Form1Reflash() { while (true) { Thread.Sleep(500); xxxxxxx++; //Console.WriteLine("From1 Reflash:{0}", xxxxxxx); /******************用户登录、管理员权限检测***************************************************************/ if (CTMySql.isSignIn) //用户已登录时 { UserLogOut.Enabled = true; //退出登录按钮 解锁 UserSwitch.Enabled = true; //切换用户按钮 解锁 UserSignIn.Enabled = false; //用户登录按钮 锁定 SP_Set.Enabled = true; //串口设置按钮 解锁 } else //用户未登录时 { UserManage.Enabled = false; //用户管理按钮 锁定 UserLogOut.Enabled = false; //退出登录按钮 锁定 UserSwitch.Enabled = false; //切换用户按钮 锁定 UserSignIn.Enabled = true; //用户登录按钮 解锁 SP_Set.Enabled = false; //串口设置按钮 锁定 } if (CTMySql.isUserAdmin) //用户是管理员用户时 { UserManage.Enabled = true; //用户管理按钮 解锁 } else //用户非管理员用户时 { UserManage.Enabled = false; //用户管理按钮 锁定 } /****************串口开启检测********************************************************************************/ if (CTSerialPort.IsComOpen()) //串口开启时 { this.SP_Ttest.Enabled = true; //连接测试按钮 解锁 this.SP_Close.Enabled = true; //断开连接按钮 解锁 } else//串口关闭时 { this.SP_Ttest.Enabled = false; //连接测试按钮 锁定 this.SP_Close.Enabled = false; //断开连接按钮 锁定 } } }
//读取串口数据 开始之前要先让信号灯通过 public void ReadSpData(object readSize) { UpdataCOMandBoud(); byte[] spData = new byte[4]; int num = 0; CTSerialPort.ClearInBuffer(); boxtest_result.Text = null; while (flag1) { if (CTSerialPort.ReadSP(ref spData, (int)readSize)) { for (int n = 0; n < 4; n++) { boxtest_result.AppendText(spData[n].ToString() + " "); //boxtest_result.Text += spData[n].ToString(); //this.boxtest_result.Focus();//获取焦点 //this.boxtest_result.Select(this.boxtest_result.TextLength, 0);//光标定位到文本最后 //this.boxtest_result.ScrollToCaret();//滚动到光标处 } //boxtest_result.Text += " "; //this.boxtest_result.Focus();//获取焦点 //this.boxtest_result.Select(this.boxtest_result.TextLength, 0);//光标定位到文本最后 //this.boxtest_result.ScrollToCaret();//滚动到光标处 System.DateTime currentTime = new System.DateTime(); currentTime = System.DateTime.Now; Console.WriteLine("Min:" + currentTime.Minute.ToString() + " Sec:" + currentTime.Second.ToString() + " MsecL" + currentTime.Millisecond.ToString() + "\r\n"); num++; } if (num >= 10) { boxtest_result.Text += "\r\n测试成功\r\n"; flag1 = false; SendSpData("E"); return; } } boxtest_result.Text += "\r\n测试失败,未接收到完整数据\r\n"; SendSpData("E"); return; }
//开始测试按钮 点击 public void Button_sp_test_Click(object sender, EventArgs e) { if (!CTSerialPort.IsComOpen()) { MessageBox.Show("串口未打开"); return; } button_sp_test_close.Focus(); //焦点置于停止测试按钮 button_sp_test_close.Enabled = true; //停止测试按钮 解锁 button_sp_tests_start.Enabled = false; //开始测试按钮 锁定 //开始读取串口数据线程 Thread readData = new Thread(ReadSpData); //实例一个读取数据线程 readData.IsBackground = true; //设置为后台线程 readData.Priority = ThreadPriority.Highest; //设置线程优先级为高 flag1 = true; //读数据线程信号灯通过 readData.Start(4); //开始线程 SendSpData("A"); //给下位机发送开始发送数据信号 }
//发送串口数据 public void SendSpData(string sendData) { CTSerialPort.SendSP(sendData); }