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

news2024/11/23 21:57:01

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站硬件家园

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1404927.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Gene Expression Prediction】Part3 Deep Learning in Gene Expression Analysis

文章目录 6 第二个讲座&#xff1a;Deep Learning in Gene Expression Analysis6.1 Introduction6.2 D-GEX6.2.1 Connectivity map project6.2.2 Predicting gene expression from landmark genes 6.3 Deep generative models for genomics6.3.1 Manifold hypothesis6.3.2 Auto…

【C++】Qt:QCustomPlot图表绘制库配置与示例

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍QCustomPlot图表绘制库配置与示例。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次…

2024/1/17 DFS BFS + Div 3 a,b

目录 Lake Counting S 求细胞数量 海战 组合的输出 div3 A. Square div3 B. Arranging Cats Lake Counting S P1596 [USACO10OCT] Lake Counting S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 感谢大佬的指点&#xff01;&#xff01;&#xff01;&#xff01; 思…

k8s使用ingress实现应用的灰度发布升级

v1是1.14.0版本nginx ,实操时候升级到v2是1.20.0版本nginx&#xff0c;来测试灰度发布实现过程 一、方案&#xff1a;使用ingress实现应用的灰度发布 1、服务端&#xff1a;正常版本v1&#xff0c;灰度升级版本v2 2、客户端&#xff1a;带有请求头versionv2标识的请求访问版…

老套的购物车效果

一、项目文件结构 二、各个文件内容 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport…

【C语言进阶】预处理详解

引言 对预处理的相关知识进行详细的介绍 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》 &#x1f388;跟着猪巴戒&#xff0c;一起学习C语言&#x1f388; 目录 引言 预定义符号 #define定义常量 #define定义宏 带有副作用的宏参数 宏替换的规则 …

算法基础学习|双指针算法

双指针算法 代码模板 for (int i 0, j 0; i < n; i ){while (j < i && check(i, j)) j ;// 具体问题的逻辑 } 常见问题分类&#xff1a;(1) 对于一个序列&#xff0c;用两个指针维护一段区间(2) 对于两个序列&#xff0c;维护某种次序&#xff0c;比如归并…

echarts绘制饼图,部分数据隐藏指示线和文本,hover时隐藏指示线和文本的类别也不显示tooltip提示

option {tooltip: {trigger: item,formatter: (p) > {if (p.name) {return ${p.name}&#xff1a;${p.value}个;}},backgroundColor: #ffffff,textStyle: { color: #666666 } // 提示标签字体颜色},legend: {top: 5%,left: center},series: [{name: Access From,type: pie,…

第三方控价服务商怎么选

用对了方法&#xff0c;事半功倍&#xff0c;品牌控价也是如此&#xff0c;品牌方在治理工作中&#xff0c;如果选择自建团队进行处理&#xff0c;需要包含对数据技术的抓取团队&#xff0c;还要有对治理规则熟悉的操作团队&#xff0c;涉及人员和系统&#xff0c;费用成本相应…

TA百人计划学习笔记 3.1.1模板测试

资料 源视频 【技术美术百人计划】图形 3.1 深度与模板测试 传送门效果示例_哔哩哔哩_bilibili ppt 3100-模板测试与深度测试(1) 参考 Unity Shader: 理解Stencil buffer并将它用于一些实战案例&#xff08;描边&#xff0c;多边形填充&#xff0c;反射区域限定&#xff0c;阴影…

EXECL 单元格字符串链接 CONCAT :应用:将一行数据转为json

源&#xff1a; 目标 函数表示 CONCAT("data", CHAR(10), "{", CHAR(10), " ", "ulAlarmId : ", A5, CHAR(10), " ", "ulAlarmLevel : ", D5, CHAR(10)," ", "bBo…

远程桌面--虚拟机与主机的文件传输

注意&#xff1a; 确保VMware开头的服务全部在运行进入虚拟机打开文件管理器点击计算机右键选择属性在选择远程管理选择允许 1.winR 输入mstsc 2.输入虚拟机的ip地址 2.输入虚拟机的密码 上面的Administrator是虚拟机的用户名&#xff0c;有时会需要我们手动输入 3.验证…

【华为 ICT HCIA eNSP 习题汇总】——题目集7

1、一台 PC 的 MAC 地址是 5489-98FB-65D8 &#xff0c;管理员希望该 PC 从 DHCP 服务器获得指定的 IP 地址为192.168.1.11/24&#xff0c;以下命令配置正确的是&#xff08;&#xff09;。 A、dhcp static-bind ip-address 192.168.1.11 24 mac- address 5489-98FB-65D8 B、dh…

java(渣哇)------输入与输出语句(详解) (๑•̌.•๑)

目录 一.java的输出语句&#xff1a; System.out.println() -----输出并换行 System.out.print() -----输出但不换行 System.out.printf() -----类似C语言的printf()输出语句,按格式进行输出 二.java的输入语句&#xff1a; 2.1-----Scanner的基础用法&#xff1a; 2.2…

【江科大】STM32:外部中断(Extern Interrupt)

文章目录 EXTI&#xff08;Extern Interrupt&#xff09;外部中断EXIT的基本结构EXIT框图 旋转编码器简介库函数&#xff1a;对射式红外传感器计次&#xff1a;代码展示&#xff1a;旋转编码器计次注意&#xff1a; EXTI&#xff08;Extern Interrupt&#xff09;外部中断 功能…

vue2中CesiumV1.113.0加载离线地形数据

离线地形数据可以放在vue项目下的public/data/sjzTerrain文件下 由于地形离线数据数量太大&#xff0c;在vue项目编译时会报如下错误&#xff1a; ERROR in EMFILE: too many open files, open D:\test_project\vue_cesium_demo\public\data\sjzTerrain\.tmp\14\26787\11669.h…

macos pip3 install pycryptodome导入from Crypto.Cipher import AES报错

问题&#xff1a; 已经使用pip3 install pycryptodome安装成功了&#xff0c;但是导入from Crypto.Cipher import AES还是提示Unresolved reference Crypto 原因&#xff1a; 一句话&#xff1a;安装文件大小写问题&#xff08;这只是我遇到的一种情况&#xff09;。 修改&am…

牛客周赛 Round 18 解题报告 | 珂学家 | 分类讨论计数 + 状态DP

前言 整体评价 前三题蛮简单的&#xff0c;T4是一个带状态的DP&#xff0c;这题如果用背包思路去解&#xff0c;不知道如何搞&#xff0c;感觉有点头痛。所以最后还是选择状态DP来求解。 欢迎关注 珂朵莉 牛客周赛专栏 珂朵莉 牛客小白月赛专栏 A. 游游的整数翻转 这题最好…

03.Elasticsearch应用(三)

Elasticsearch应用&#xff08;三&#xff09; 1.核心概念介绍 注意&#xff1a;类型&#xff08;Type&#xff09; 6.0之前的版本有Type概念&#xff0c;type相当于关系型数据库的表&#xff0c;ES官方将在ES9版本中彻底删除Type。7里面Type为ES默认的类型_doc 2.Cat API 介…

面试经典 150 题 - 多数元素

多数元素 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1&#xff1a; 输入&#xff1a;nums [3,2,3] 输出&#xff1…