C#winform上位机开发学习笔记5-串口助手的定时发送功能添加

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];//发送函数需要定义数组首地址
            //发送格式为ASCII
            if (!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();//串口关闭情况下关闭串口有效检测功能
                }
            }
            //发送格式为HEX
            else
            {
                //处理字符串
                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的子字符串,长度为2
                    try
                    {
                        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();//串口关闭情况下关闭串口有效检测功能
                    }
                }
                //发送CRC
                if (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站硬件家园

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# Winform上位机是一种基于Windows桌面应用程序的上位机开发方式,可以通过串口通信等方式与下位机进行数据交互。以下是一个简单的C# Winform上位机的例子: 1.在Visual Studio中创建一个Windows Forms应用程序项目。 2.在窗体上添加一个ComboBox控件和一个Button控件。 3.在代码中引用System.IO.Ports命名空间,使用SerialPort类实现串口通信。 4.在Button的Click事件中编写代码,获取可用串口列表并在ComboBox中显示。 5.在ComboBox的SelectedIndexChanged事件中编写代码,获取选中的串口名称并打开串口。 6.在串口接收事件中编写代码,处理下位机发送的数据。 以下是一个简单的C# Winform上位机的代码示例: ```csharp using System; using System.IO.Ports; using System.Windows.Forms; namespace WinformSerialPort { public partial class Form1 : Form { private SerialPort serialPort; public Form1() { InitializeComponent(); serialPort = new SerialPort(); serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived); } private void Form1_Load(object sender, EventArgs e) { string[] ports = SerialPort.GetPortNames(); if (ports.Length != 0) { comboBox1.Items.AddRange(ports); comboBox1.SelectedIndex = 0; } else { MessageBox.Show("请插入串口设备!!"); } } private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { if (serialPort.IsOpen) { serialPort.Close(); } serialPort.PortName = comboBox1.SelectedItem.ToString(); serialPort.BaudRate = Convert.ToInt32(comboBox2.SelectedItem.ToString()); serialPort.Open(); } private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { string data = serialPort.ReadExisting(); // 处理接收到的数据 } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值