C#winform上位机开发学习笔记6-串口助手的断帧功能添加

1.功能描述

按照设定时间对接收数据进行断帧(换行)

应用于需要接收完整数据包的场景,例如下位机发送一包数据为1秒,每100ms发送一组数据

大部分用于接收十六进制数据时

2.代码部分

步骤1:添加计时器,设置默认时间为500ms

步骤2:去掉断帧复选框默认使能

步骤3:设置断帧复选框时间集合

 步骤4:开启HEX接收数据选择框时

//当开启HEX接收时事件private void checkBox16_CheckedChanged(object sender, EventArgs e){//启动与禁用断帧功能if (checkBox16.Checked == true){comboBox16.Enabled = true;//使能断帧时间复选框//设定定时参数timer4.Interval = Convert.ToUInt16(comboBox16.Text, 10);//启动定时器4timer4.Start();}else{comboBox16.Enabled = false;//停止定时器4timer4.Stop();}}

步骤5:编写定时器事件

定义局部变量声明

//断帧定时器事件private void timer4_Tick(object sender, EventArgs e){Timer4_Flag = true;//置位定时器4标志位}

步骤6:串口接收事件中添加代码

                    //断帧功能if (Timer4_Flag == true){Timer4_Flag = false;textBox1.AppendText("\r\n");textBox1.AppendText("[" + DateTime.Now.ToString("HH:mm:ss") + "]" + "->");}

步骤7:断帧复选时间设置

//断帧复选框事件_选择断帧时间private void comboBox16_SelectedIndexChanged(object sender, EventArgs e){//设定定时参数//将组合框中的数据转换为整型赋值给定时器参数timer4.Interval = Convert.ToUInt16(comboBox16.Text, 10);}

3.完整代码

        //用于串口通讯断帧bool Timer4_Flag = false;//串口接收事件private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e){//接收格式为ASCII码if (!checkBox16.Checked)//复用框没有被选择时{try{textBox1.AppendText("[" + DateTime.Now.ToString("HH:mm:ss") + "]" + "->");string str = serialPort1.ReadExisting();//将接收到的数据存在自定义的字符串变量中textBox1.AppendText(str + "\r\n");//统计接收字节数UInt32 RBytes = Convert.ToUInt32(textBox7.Text, 10);//定义接收字节数变量,并初始化为已接收字节数RBytes += (UInt32)str.Length;//加ASCII码字节数textBox7.Text = Convert.ToString(RBytes, 10);//显示总接收字节数}catch{textBox1.AppendText("[" + DateTime.Now.ToString("HH:mm:ss") + "]" + "->");textBox1.AppendText("ASCII格式接收错误!\r\n");}}//接收格式为HEXelse{try{//断帧功能if (Timer4_Flag == true){Timer4_Flag = false;textBox1.AppendText("\r\n");textBox1.AppendText("[" + DateTime.Now.ToString("HH:mm:ss") + "]" + "->");}//textBox1.AppendText("[" + DateTime.Now.ToString("HH:mm:ss") + "]" + "->"); //此处被断帧功能替代换行byte[] data = new byte[serialPort1.BytesToRead];//定义接收缓冲区,长度为串口接收的数据长度serialPort1.Read(data, 0, data.Length);//形参,起始位置,终止位置,将读取的数据存放在缓冲区//遍历用法foreach (byte Member in data)//循环函数{string str = Convert.ToString(Member, 16).ToUpper();//转化为十六进制大写textBox1.AppendText((str.Length == 1 ? "0" + str : str) + " ");//数据+空格“”}//textBox1.AppendText("\r\n"); //此处被断帧功能替代换行//统计接收字节数UInt32 RBytes = Convert.ToUInt32(textBox7.Text, 10);//定义接收字节数变量,并初始化为已接收字节数RBytes += (UInt32)data.Length;//加HEX字节数textBox7.Text = Convert.ToString(RBytes, 10);//显示总接收字节数}catch{textBox1.AppendText("[" + DateTime.Now.ToString("HH:mm:ss") + "]" + "->");textBox1.AppendText("HEX格式接收错误!\r\n");}}}//当开启HEX接收时事件private void checkBox16_CheckedChanged(object sender, EventArgs e){//启动与禁用断帧功能if (checkBox16.Checked == true){comboBox16.Enabled = true;//使能断帧时间复选框//设定定时参数timer4.Interval = Convert.ToUInt16(comboBox16.Text, 10);//启动定时器4timer4.Start();}else{comboBox16.Enabled = false;//停止定时器4timer4.Stop();}}
//断帧定时器事件private void timer4_Tick(object sender, EventArgs e){Timer4_Flag = true;//置位定时器4标志位}
//断帧复选框事件_选择断帧时间private void comboBox16_SelectedIndexChanged(object sender, EventArgs e){//设定定时参数//将组合框中的数据转换为整型赋值给定时器参数timer4.Interval = Convert.ToUInt16(comboBox16.Text, 10);}}

4.测试结果

当下位机为500m定时发送,上位机设置断帧为500ms断帧时,接收的十六进制数据为500ms一帧数据,当设置上位机断帧时间为1s时,接收的十六进制一帧数据为下位机发送的两帧数据。

参考自B站硬件家园

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EasyExcelFactory 导入导出功能的实战使用

EasyExcelFactory 导入导出功能的实战使用分享&#xff1a; 1、jar包引入 <!-- 阿里巴巴Excel处理--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.6</version></dependen…

科技、文化与旅游的融合创新:智慧文旅的未来之路

在当今社会&#xff0c;科技、文化与旅游的融合已经成为文旅产业转型升级的重要趋势。这种融合不仅有助于提升文旅产业的核心竞争力&#xff0c;更有助于推动产业的数字化转型和可持续发展。 本文将深入探讨科技、文化与旅游的融合创新&#xff0c;以及智慧文旅场景的解决方案…

快速上手MyBatis Plus:简化CRUD操作,提高开发效率!

MyBatisPlus 1&#xff0c;MyBatisPlus入门案例与简介1.1 入门案例步骤1:创建数据库及表步骤2:创建SpringBoot工程步骤3:勾选配置使用技术步骤4:pom.xml补全依赖步骤5:添加MP的相关配置信息步骤6:根据数据库表创建实体类步骤7:创建Dao接口步骤8:编写引导类步骤9:编写测试类 1.2…

回调地狱 与 Promise(JavaScript)

目录捏 前言一、异步编程二、回调函数三、回调地狱四、Promise1. Promise 简介2. Promise 语法3. Promise 链式 五、总结 随着 Node v7 的发布&#xff0c;越来越多的人开始研究据说是异步编程终级解决方案的 async/await。而 JavaScript 的 async/await 实现&#xff0c;也离不…

RK3568笔记十一:mpp编解码

若该文为原创文章&#xff0c;转载请注明原文出处。 主要是想测试MPP的解码&#xff0c;为后续做测试。 一、环境 1、平台&#xff1a;rk3568 2、开发板:ATK-RK3568正点原子板子 3、环境&#xff1a;buildroot 二、编译 使用的是正点原子提供的虚拟机&#xff0c;搭建好环…

(十二)Head first design patterns代理模式(c++)

代理模式 代理模式&#xff1a;创建一个proxy对象&#xff0c;并为这个对象提供替身或者占位符以对这个对象进行控制。 典型例子&#xff1a;智能指针... 例子&#xff1a;比如说有一个talk接口&#xff0c;所有的people需要实现talk接口。但有些人有唱歌技能。不能在talk接…

redis高可用之主从部署

文章目录 前言1. 同步以及命令传播1.1 同步1.2 命令传播 2. 解决从服务器断线重连2.1 解决方案 3. PSYNC命令4. 复制步骤1:设置主服务器的地址和端口步骤2:建立套接字连接 ——其实就是建立TCP连接步骤3:发送PING命令步骤4:身份验证步骤5:发送端口信息步骤6:同步步骤7:命令传播…

【学习】FPN特征金字塔

论文&#xff1a;Feature Pyramid Networks for Object Detection &#xff08;CVPR 2016) 参考blog&#xff1a;https://blog.csdn.net/weixin_55073640/article/details/122627966 参考视频讲解&#xff1a;添加链接描述 卷积网络中&#xff0c;深层网络容易响应语义特征&am…

对 MODNet 其他模块的剪枝探索

写在前面 先前笔者分享了《对 MODNet 主干网络 MobileNetV2的剪枝探索》&#xff0c;没想到被选为了CSDN每天值得看系列&#xff0c;因为笔者开设的专栏《MODNet-Compression探索之旅》仅仅只是记录笔者在模型压缩领域的探索历程&#xff0c;对此笔者深感荣幸&#xff0c;非常…

Web3艺术市场:NFT与数字创作的结合

在数字时代&#xff0c;随着区块链技术的崛起&#xff0c;一种新型数字资产&#xff0c;非同质化代币&#xff08;NFT&#xff09;&#xff0c;正逐渐改变传统艺术市场的格局。这种数字化的艺术品售卖方式成为了Web3艺术市场的代表&#xff0c;推动着数字创作与艺术市场的结合。…

(十)Head first design patterns组合模式(c++)

组合模式 组合模式在参考链接中已经讲得很好了&#xff0c;这里只简单讲讲就好。 组合模式的意图是表达部分-整体层次结构。 当你需要管理一个组合对象&#xff0c;又要管理这个组合对象的单个对象。这个时候就可以让这个组合对象和单个对象继承同一个基类&#xff0c;以便用…

BP蓝图映射到C++笔记1

教程链接&#xff1a;示例1&#xff1a;CompleteQuest - 将蓝图转换为C (epicgames.com) 1.常用的引用需要记住&#xff0c;如图所示。 2.蓝图中可以调用C函数&#xff0c;也可以实现C函数 BlueprintImplementableEvent:C只创建&#xff0c;不实现&#xff0c;在蓝图中实现 B…