简单介绍
在下是位大四的电子专业的学生,考虑到嵌入式上位机的重要性,所以学习一下用C#写上位机,这也是我全靠看网上各位前辈的帖子和资料,才完成的,感谢各位前辈大佬!
首先,确定一下功能,正常的数据收发、十六进制收发、添加回车换行、自动发送,这些是经常会用到的功能。
设计过程
犹豫再三还是从头开始吧,毕竟可能大家也和我一样,目前都是小白。
1.创建项目,及工程(我用的是Visual Studio 2019)选择windows 窗体应用;
2. 设置项目名、保存路径、还有框架,框架这里我选择的是.NET XXX 4.6.1因为后面程序设计完成,打包成.exe文件时,还需要用到这里的框架,最后点击创建;
3.创建项目完成后,进入工程管理器,左边白色部分就是Form编辑窗口;
4. 点击打开视图–》》工具箱,左边栏就出现了,各控件列表,这就是我们做上位机最基本的部分,点开公共控件、容器等就可以看到我们常用到的各个组件了;
5. 从工具箱中拖出Button等控件,并用鼠标点击选中,界面右下角则显示出其属性;
6. 现在添加我们需要的控件,从工具箱中
拖出4个GroupBox 分别将属性中的Text改为串口设置、定时发送、发送数据、接收数据。GroupBox 控件是将其它的控件放入其中,形成一个控件组。
拖出6个Label分别Text设置为: 串口号:、波特率:、数据位:、停止位:、奇偶校验: 、时间;
拖出5个ComboBox,分别将name(属性窗口往上拉就可以找到)设置为cbxCOMPort、cbxBaudRate、cbxDataBits、cbxStopBits、cbxParity;
拖出2个RadioButton,Text分别设置为:字符显示、HEX显示
name分别设置为rbnChar、rbnHex Checked分别为:True、False(将这2个放在同一个GroupBox中,RadioButton控件只能被选中一个)
拖出4个Button,Text分别设置为检测串口、打开串口、发送数据、清除数据,name分别设置为btnCheckCom、btnOpenCom、btnSendData、btnClearData
拖出3个CheckBox,Text分别设置为HEX发送、回车换行、自动发送;
拖出一个NumericUpDown;
拖出2个TextBox,name分别设置为tbxRecvData、tbxSendData,接收的ReadOnly属性设置为True。点击框上面的黑色小三角,选中MultiLine可任意伸缩大小。属性中的Font可修改字体大小等,ScrollBars设置为Both可垂直、水平拉伸信息;
拖出一个StatusStrip;
拖出2个Timer;
点击Form1面板上边沿部分,选中面板,在属性中BackColor可修改背景颜色,AcceptButton设置为btnSendData,在窗体上回车关联到发送数据按钮,Text可修改左上方名称,Icon可设置图标;
7. 双击控件可跳转到事件程序中,外框架搭好了,接下来就是写程序,完善其功能。
在Form1.cs中添加using System.IO.Ports;
using System.Text.RegularExpressions;//正则表达式,加入命名空间。
- 程序源码
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;
using System.IO.Ports;
using System.Text.RegularExpressions;//正则表达式
namespace uart_app
{
public partial class Form1 : Form
{
SerialPort sp = null;
bool isOpen = false;
bool isSetProperty = false;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
this.MaximizeBox = false;
this.MaximumSize = this.Size;
this.MinimumSize = this.Size;
for (int i = 0; i < 20; i++)
{
cbxCOMPort.Items.Add("COM" + (i + 1).ToString());
}
cbxCOMPort.SelectedIndex = 0;
cbxBaudRate.Items.Add("1200");
cbxBaudRate.Items.Add("2400");
cbxBaudRate.Items.Add("4800");
cbxBaudRate.Items.Add("9600");
cbxBaudRate.Items.Add("19200");
cbxBaudRate.Items.Add("38400");
cbxBaudRate.Items.Add("115200");
cbxBaudRate.SelectedIndex = 6;
cbxStopBits.Items.Add("0");
cbxStopBits.Items.Add("1");
cbxStopBits.Items.Add("1.5");
cbxStopBits.Items.Add("2");
cbxStopBits.SelectedIndex = 1;
cbxParity.Items.Add("无");
cbxParity.Items.Add("奇校验");
cbxParity.Items.Add("偶校验");
cbxParity.SelectedIndex = 0;
cbxDataBits.Items.Add("8");
cbxDataBits.Items.Add(