1.功能描述
选择自动发送功能后,按照设定的发送时间发送发送框中的信息数据,设定时间可以手动输入,当手动输入信息无效(非数字)时,系统弹出错误提示,并将其设置为默认定时时间。
2.代码部分
步骤1:增加计时器空间Timer
步骤2:使能计时器,默认设置定时时间为1秒
注:这里在测试时出现错误,默认使能应该关闭,如果一开始就开启,那在软件打开时会自动启动定时发送数据!!!默认使能,点击定时发送选择框才会使能。
步骤3:组合框设置默认复选信息
步骤4:编写选择框事件函数
//自动发送事件private void checkBox27_CheckedChanged(object sender, EventArgs e){//启动定时器发送if (checkBox27.Checked == true){textBox1.AppendText("[" + DateTime.Now.ToString("HH:mm:ss") + "]" + "->");textBox1.AppendText("启动定时发送!\r\n");//设定定时参数try{//将组合框中的数据转换为整型赋值给定时器参数timer3.Interval = Convert.ToUInt16(comboBox15.Text, 10);}catch{//出错提示MessageBox.Show("输入时间有误,设定为默认值", "提示");comboBox15.Text = "1000";timer3.Interval = 1000;}//启动定时器timer3.Start();}//关闭定时器发送else{textBox1.AppendText("[" + DateTime.Now.ToString("HH:mm:ss") + "]" + "->");textBox1.AppendText("关闭定时发送!\r\n");}//关闭定时器timer3.Stop();}
步骤5:自动发送定时器函数
采用两种方式,其一是将发送按钮的函数代码copy,其二是直接调用发送按钮事件函数
生成按钮单击事件:
//实现方式2:生成发送按钮事件
button29.PerformClick();
//定时发送定时器函数private void timer3_Tick(object sender, EventArgs e){if(false){//实现方法1:直接调用发送按钮中的程序--------------------------------------------------------------------------byte[] data = new byte[1];//发送函数需要定义数组首地址//发送格式为ASCIIif (!checkBox24.Checked)//复用框没有被选择时{try{//支持中文输出Encoding Chinese = System.Text.Encoding.GetEncoding("GB2312");//定义一个可以进行中文编码的变量byte[] Sendbytes = Chinese.GetBytes(textBox5.Text);//将发送框的内容编译为中文//遍历发送用法foreach (byte Member in Sendbytes)//循环函数{data[0] = Member;serialPort1.Write(data, 0, 1);//单字节发送}//发送回车换行if (checkBox26.Checked)//发空复选框{data[0] = 0x0D;//发送回车serialPort1.Write(data, 0, 1);data[0] = 0x0A;//发送换行serialPort1.Write(data, 0, 1);}//统计发送字节数UInt32 SBytes = Convert.ToUInt32(textBox6.Text, 10);//定义发送字节数变量,并初始化为已接收字节数SBytes += (UInt32)Sendbytes.Length;//加ASCII码字节数if (checkBox26.Checked == true)//加回车换行2个字节SBytes += 2;textBox6.Text = Convert.ToString(SBytes, 10);//显示总发送字节数}catch{textBox1.AppendText("\r\n串口数据发送错误!\r\n");//textBox5.Text = "";//若出现错误不清空发送框的内容//串口按钮显示为关闭serialPort1.Close();button2.BackgroundImage = Properties.Resources.Image_CloseSerial;button2.Tag = "OFF";timer1.Stop();//串口关闭情况下关闭串口有效检测功能}}//发送格式为HEXelse{//处理字符串string Buf = textBox5.Text;Buf = Buf.Replace("0x", string.Empty);//将buf中的0x替换为空格,消除0x的不规范书写方式Buf = Buf.Replace("0X", string.Empty);Buf = Buf.Replace(" ", string.Empty);byte[] Calculate_CRC = new byte[(Buf.Length - Buf.Length % 2) / 2];//CRC缓存区textBox5.Text = " ";//循环发送for (int i = 0; i < (Buf.Length - Buf.Length % 2) / 2; i++)//取余运算作用是防止用户输入的字符为奇数个{textBox5.AppendText(Buf.Substring(i * 2, 2) + " ");//Buf.Substring为Buf的子字符串,长度为2try{data[0] = Convert.ToByte(Buf.Substring(i * 2, 2), 16);//将字符串转换为十六进制的整型serialPort1.Write(data, 0, 1);//单字节发送Calculate_CRC[i] = data[0];//CRC参数赋值}catch{textBox1.AppendText("\r\n串口数据发送错误!\r\n");//textBox5.Text = "";//若出现错误不清空发送框的内容//串口按钮显示为关闭serialPort1.Close();button2.BackgroundImage = Properties.Resources.Image_CloseSerial;button2.Tag = "OFF";timer1.Stop();//串口关闭情况下关闭串口有效检测功能}}//发送CRCif (checkBox25.Checked){UInt32 CRC = Crc_Check(Calculate_CRC, (byte)Calculate_CRC.Length);//crc计算byte CRC_H = (byte)(CRC >> 8);byte CRC_L = (byte)CRC;try{data[0] = CRC_L;serialPort1.Write(data, 0, 1);//发送低位data[0] = CRC_H;serialPort1.Write(data, 0, 1);//发送高位}catch{textBox1.AppendText("\r\n串口数据发送错误!\r\n");//textBox5.Text = "";//若出现错误不清空发送框的内容//串口按钮显示为关闭serialPort1.Close();button2.BackgroundImage = Properties.Resources.Image_CloseSerial;button2.Tag = "OFF";timer1.Stop();//串口关闭情况下关闭串口有效检测功能}}//统计发送字节数UInt32 SBytes = Convert.ToUInt32(textBox6.Text, 10);//定义发送字节数变量,并初始化为已接收字节数SBytes += (UInt32)Calculate_CRC.Length;//加HEX字节数 //byte[] Calculate_CRC = new byte[ (Buf.Length - Buf.Length % 2) / 2];//同等替用if (checkBox25.Checked == true)//加CRC校验2个字节 SBytes += 2;textBox6.Text = Convert.ToString(SBytes, 10);//显示总发送字节数}//发送完清空if (checkBox23.Checked)//发空复选框{textBox5.Text = "";}//实现方式1程序止--------------------------------------------------------------------------}else{//实现方式2:生成发送按钮事件button29.PerformClick();}}
步骤6:编写组合框事件函数
//设置定时时间事件private void comboBox15_SelectedIndexChanged(object sender, EventArgs e){//设定定时参数//将组合框中的数据转换为整型赋值给定时器参数timer3.Interval = Convert.ToUInt16(comboBox15.Text, 10);}
3.完整代码
代码部分已是完整代码
4.测试结果
正常根据选择时间定时发送数据
输入定时时间为非数字时弹出提示框
参考自B站硬件家园