C#上位机系列(4)—示波器一新窗口的建立

news2024/12/23 10:16:47

本文是讲解C#.net平台的Winform框架下的第四个内容,手把手介绍上位机项目的创建方式以及一些写软件时常用的功能,讲解从零开始的每一个步骤。

本次介绍上位机中新窗口的建立方式和软件示波器的代码原理

从此节开始,所有代码附后

1.新窗口的建立

一般上位机可以和其他功能在同一个窗口下显示

然而随着功能逐渐复杂后,需要新建一个独立的窗口来完成示波器的功能。

新建一个用于打开新窗口的按键

 双击Button按钮,后面编写新窗体函数

 创建一个新的窗口

 给窗口加上标签

 回到主窗口的函数,声明一个新窗体实例

回到主窗口按键的函数,添加如下代码创建并开启新窗口

 为了避免多次创建,需要判断当前新窗口是否存在

 运行程序,可以开启关闭试一试

2.示波器代码原理

前期粗略展示

 所有的图像无非是一帧一帧的动画组成的

一帧动画由点线面和各种图案文字组成

为了画出这图案,就需要知道点的坐标,和其他的一些绘图参数(如颜色等)

图案分为两组,一种是固定不变的(背景图案),还有不断变化的(波形曲线)

对于一个窗口的来说,左上角即为坐标原点,既(0,0),往右是x轴,往下是Y轴

了解了这些基本原理,下一节便可以在新窗口中进行作图了

附主窗口功能代码供参考

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WinForms_Start1
{
    public partial class Form1 : Form
    {
        int a = 1;//用于定时器计数

        FormScope form_Scope;        //声明一个示波器窗口的类

        public Form1()
        {
            InitializeComponent();//窗口初始化
            //这里我们设置两个串口,一个发送,另一个接受
            //设置串口1参数
            serialPort1.PortName = "COM1"; //端口为串口一
            serialPort1.BaudRate = 9600;   //波特率9600
            serialPort1.Parity = System.IO.Ports.Parity.None;  //校验位无
            serialPort1.DataBits = 8;   //数据位8
            serialPort1.StopBits = System.IO.Ports.StopBits.One;  //停止位1
            //设置串口2参数                                               
            serialPort2.PortName = "COM2"; //端口为串口二
            serialPort2.BaudRate = 9600;   //波特率9600
            serialPort2.Parity = System.IO.Ports.Parity.None;  //校验位无
            serialPort2.DataBits = 8;   //数据位8
            serialPort2.StopBits = System.IO.Ports.StopBits.One;  //停止位1

            //serialPort1.Open();  //打开串口1
            //serialPort2.Open();  //打开串口2

        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            a++;
            //lbl1.Text = a.ToString();
        }
        //发送按钮
        private void btn_send_Click(object sender, EventArgs e)
        {
            byte[] b = new byte[1];  //创建一个保存发送数据的字节数组
            b[0] = Convert.ToByte(textBox3.Text);   //将发送文本框里的数字存入数组
            serialPort1.Write(b,0,1);   //发送
        }
        //接受按钮
        private void btn_receive_Click(object sender, EventArgs e)
        {
            byte[] buffer = new byte[serialPort2.BytesToRead];//创建一个保存接受数据的字节数组
            serialPort2.Read(buffer, 0, buffer.Length);   //将接受的数据保存到数组中
            textBox2.Text = buffer[0].ToString();//读一个字节
        }
        //新窗口
        private void btn_Scope_Click(object sender, EventArgs e)
        {
            //新窗口开启函数
            if (form_Scope == null)//Displayer = null则为第一次创建
            {
                form_Scope = new FormScope();//实例化
                form_Scope.Show(); //显示窗口
            }
            else
            {
                if (form_Scope.IsDisposed)//多次创建通过判断IsDisposed确定是否已关闭,避免多次创建
                {
                    form_Scope = new FormScope();
                    form_Scope.Show(); //显示窗口
                }
            }
        }
    }
}

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

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

相关文章

element-plus中menu的基本知识点

在vue后台管理系统中,menu是经常会用到的必不可少的导航组件,这个组件如果是单纯的去使用,很简单。但是在实际开发过程中,与其有关的路由相结合使用,还是容易搞混一些东邪,所以想在这里记录一下。 从产品的…

SuperMap 云原生常见问题解决办法-consul启动异常

在iManager for K8S产品中,如果创建了云套件站点,会有三个consul的服务,consul在云套件中充当的角色是服务发现,服务注册,以及配置共享。如果consul服务失效,云套件的整体服务将不能正常运行。客户在使用云…

用DIV+CSS技术设计的环保主题网站(web前端网页制作课作业)

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

教你如何在优麒麟上搭建 RISC-V 交叉编译环境

由于 RISC-V 设备价格昂贵、不易采购等诸多原因,许多小伙伴虽然很感兴趣,但仍无法参与 RISC-V 开发工作,今天就教大家如何在优麒麟上搭建 RISC-V 交叉编译环境,快学起来吧! 交叉编译(Cross Compile&#x…

收藏 | 机器学习公共数据集集锦(附下载链接)

>>>深度学习Tricks&#xff0c;第一时间送达<<< &#x1f680;&#x1f680;&#x1f680;近期&#xff0c;小海带在空闲之余&#xff0c;收集整理了一批机器学习公共数据集供大家参考。 整理不易&#xff0c;小伙伴们记得一键三连喔&#xff01;&#xff0…

cpu天梯图2022年11月 cpu排行榜天梯图2022

一、i9-13900K 1、13900K参数&#xff1a;24核32线程&#xff0c;睿频5.8GHz&#xff0c;基础功耗125W&#xff0c;最大睿频功耗253W。 2、推荐搭配主板&#xff1a;Z790、B760、Z690、B660。 3、目前单核性能最强的一款CPU&#xff0c;拥有超强的超频能力&#xff0c;为玩家带…

swift指针内存管理-引用

引用探究 首先看一个例子 那么这个 0x0000000000000003 是什么意思呢 回到swift源码 找到关键核心类型 HeapObject 就是 swift 分配内存获取到的结构类型 HeapObject 第一个8字节为 metadata, 接下来是宏 InlineRefCounts 其实 就是泛型真正类型 InlineRefCountBits 至此&am…

Android性能优化方法论

作为一名开发&#xff0c;性能优化是永远绕不过去的话题&#xff0c;在日常的开发中&#xff0c;我们可肯定都会接触过。Android 的性能优化其实是非常成熟的了&#xff0c;成熟的套路&#xff0c;成熟的方法论&#xff0c;成熟的开源框架等等。 对于接触性能优化经验较少的开…

大学生简单个人静态HTML网页设计作品 DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

APS计划排程结果的量化评价

APS计划排程系统是供应链管理软件中的一种提升管理决策协助系统软件&#xff0c;它通过约束理论、运用多种多样数学分析优化计算方法、有常驻运行内存运转的互动式计算机软件。它借助于某些繁杂的数学运算方式 来处理多种多样自变量&#xff0c;使供应链管理的提升变成事实。 A…

计硕3班-陈陇刚-2022222278-第二章 递归与分治策略 作业

目录 1. 概括第二章学习内容&#xff0c;总结第二章学习心得 1.1 递归 1.1.1 递归的定义 1.1.2 递归的使用场景 1.2 分治 1.2.1 分治的定义 1.2.2 分治法使用场景 1.3 学习心得 2. 描述Fibonacci数列递归算法&#xff0c;并进行时间复杂度分析 2.1 Fibonacci数列定义 …

测试人经验谈:需求不明确也能写出测试用例

测试人员的用例编写&#xff0c;一般基于经验和需求文档进行&#xff0c;但是很多时候项目是没有需求的&#xff0c;特别是领导的某个概念提出&#xff0c;然后开发会根据自己的理解完成&#xff0c;测试人员在没有获得任何依据和需求的情况下如何编写测试用例呢&#xff1f; …

【数据结构】七种排序方法,一篇文章掌握

文章目录前言1. 直接插入排序1.1 画图演示1.2 直接插入排序详细步骤1.3 时间复杂度&#xff0c;空间复杂度分析2. 希尔排序2.1 具体步骤描述2.2 代码详解2.3时间复杂度,空间复杂度分析3. 选择排序3.1 画图讲解3.2 代码讲解3.3 时间复杂度,空间复杂度分析4. 快速排序4.1 画图演示…

【C++初阶7-string】真方便,真舒服

前言 本期浅学一下STL的stirng。 内容概览&#xff1a; STLstring 是什么为什么怎么用&#xff08;接口介绍及使用&#xff09; 博主水平有限&#xff0c;不足之处望请斧正&#xff01; 先导 STL C中非常重要的一个东西&#xff0c;STL(Standard Template Library) 标准…

详解华夏银行iDo平台一体化运维的落地过程

随着数字化转型的深入&#xff0c;基于中台和PaaS架构的一体化运维建设也在各行各业快速展开&#xff0c;但是如何将运维平台本身的能力与企业已有的工具能力进行中台化整合、工具场景如何联动&#xff0c;是个复杂而庞大的工程。 本次&#xff0c;史春志老师以华夏银行运维平…

【Revit二次开发】元素(Element)

图元与图元类型元素元素 元素(Element)也称图元 图元作为revit建模的基础&#xff0c;数量庞大&#xff0c;关系千丝万缕。先了解图元的分类&#xff0c;将会帮助我们整理思路&#xff0c;找到功能开发的关键点。 每一个人都可以按照自己的思路将图元进行分类。建模人员可以按…

vue详细教程

原文链接&#xff1a;https://www.cnblogs.com/MrFlySand/p/16921017.html 02vue的安装 程序说明 1、在body中有2个counter&#xff0c;一个是id&#xff0c;一个是class。 2、创建应用&#xff0c;分别用id和class将配置对象传入 语法&#xff1a;Vue.createApp(方法名).mount…

DPDK之PMD原理

PMD是Poll Mode Driver的缩写&#xff0c;即基于用户态的轮询机制的驱动。本文将介绍PMD的基本原理。 在不考虑vfio的情况下&#xff0c;PMD的结构图如下&#xff1a; 图1. PMD结构图 虽然PMD是在用户态实现设备驱动&#xff0c;但还是依赖于内核提供的策略。其中uio模块&…

Java 面试题 —— TCP 粘包、拆包问题

Java 面试题 —— TCP 粘包、拆包问题 1、粘包、拆包问题概况 正常情况&#xff1a; ​  服务端一共接收到客户端的两个数据包&#xff0c;两个数据包各自包含完整的消息。 粘包问题&#xff1a; ​  服务端一共接收到客户端的一个数据包&#xff0c;这个数据包共包含两条…

【java进阶06:数组】使用一维数组模拟栈数据结构 使用二维数组模拟酒店,酒店管理系统 Arrays工具类 冒泡排序算法、选择排序算法、二分法

目录 数组 二维数组 总结 作业 Arrays工具类 数组 数组总结 及 静态初始化一维数组 /* Array:1、java语言中的数组是一种引用数据类型&#xff0c;不属于基本数据类型&#xff0c;数组的父类是Object2、数组实际上是一个容器&#xff0c;可以同时容纳多个元素&#xff08…