本文是讲解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(); //显示窗口
}
}
}
}
}