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


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

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

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

    1.新窗口的建立

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

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

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

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

     创建一个新的窗口

     给窗口加上标签

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

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

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

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

    2.示波器代码原理

    前期粗略展示

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

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

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

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

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

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

    附主窗口功能代码供参考

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Threading.Tasks;
    9. using System.Windows.Forms;
    10. namespace WinForms_Start1
    11. {
    12. public partial class Form1 : Form
    13. {
    14. int a = 1;//用于定时器计数
    15. FormScope form_Scope; //声明一个示波器窗口的类
    16. public Form1()
    17. {
    18. InitializeComponent();//窗口初始化
    19. //这里我们设置两个串口,一个发送,另一个接受
    20. //设置串口1参数
    21. serialPort1.PortName = "COM1"; //端口为串口一
    22. serialPort1.BaudRate = 9600; //波特率9600
    23. serialPort1.Parity = System.IO.Ports.Parity.None; //校验位无
    24. serialPort1.DataBits = 8; //数据位8
    25. serialPort1.StopBits = System.IO.Ports.StopBits.One; //停止位1
    26. //设置串口2参数
    27. serialPort2.PortName = "COM2"; //端口为串口二
    28. serialPort2.BaudRate = 9600; //波特率9600
    29. serialPort2.Parity = System.IO.Ports.Parity.None; //校验位无
    30. serialPort2.DataBits = 8; //数据位8
    31. serialPort2.StopBits = System.IO.Ports.StopBits.One; //停止位1
    32. //serialPort1.Open(); //打开串口1
    33. //serialPort2.Open(); //打开串口2
    34. }
    35. private void timer1_Tick(object sender, EventArgs e)
    36. {
    37. a++;
    38. //lbl1.Text = a.ToString();
    39. }
    40. //发送按钮
    41. private void btn_send_Click(object sender, EventArgs e)
    42. {
    43. byte[] b = new byte[1]; //创建一个保存发送数据的字节数组
    44. b[0] = Convert.ToByte(textBox3.Text); //将发送文本框里的数字存入数组
    45. serialPort1.Write(b,0,1); //发送
    46. }
    47. //接受按钮
    48. private void btn_receive_Click(object sender, EventArgs e)
    49. {
    50. byte[] buffer = new byte[serialPort2.BytesToRead];//创建一个保存接受数据的字节数组
    51. serialPort2.Read(buffer, 0, buffer.Length); //将接受的数据保存到数组中
    52. textBox2.Text = buffer[0].ToString();//读一个字节
    53. }
    54. //新窗口
    55. private void btn_Scope_Click(object sender, EventArgs e)
    56. {
    57. //新窗口开启函数
    58. if (form_Scope == null)//Displayer = null则为第一次创建
    59. {
    60. form_Scope = new FormScope();//实例化
    61. form_Scope.Show(); //显示窗口
    62. }
    63. else
    64. {
    65. if (form_Scope.IsDisposed)//多次创建通过判断IsDisposed确定是否已关闭,避免多次创建
    66. {
    67. form_Scope = new FormScope();
    68. form_Scope.Show(); //显示窗口
    69. }
    70. }
    71. }
    72. }
    73. }

  • 相关阅读:
    Docker Hub使用
    Java基础单元测试
    【JAVA基础】专题课(综合案例下)
    Python利用字典计数
    460.LFU缓存
    学习pandas,应该选择哪本书进行学习?
    【JAVA】多线程
    vue 自定义指令改data中数据
    FT2004(D2000)开发实战之在线开发GPIO LED程序
    CCF-B类SGP‘24 4月10日截稿!速速行动!
  • 原文地址:https://blog.csdn.net/qq_49552487/article/details/128024924