C# 实现简易的串口监视上位机功能附源码下载

下面是详细的讲解:

一、准备工作

在使用C#实现简易的串口监视上位机功能前,需要做一些准备工作:
- 确定需要监视的串口号和波特率
- 判断串口是否已打开,打开串口并设置参数
- 创建事件处理函数,用于接收和解析串口数据

二、实现步骤

第一步、创建一个新的C#项目

打开Visual Studio,创建一个新的Windows Forms应用程序。

第二步、添加控件

1. 添加串口控件

在Visual Studio的工具箱中找到“串口控件”,将其拖拽到窗体上。

2. 添加文本框控件

用于显示接收到的串口数据,在Visual Studio的工具箱中找到“文本框控件”,将其拖拽到窗体上。

第三步、实现程序逻辑

1. 打开和关闭串口

通常,打开和关闭串口应该有对应的按钮控件,用户点击打开按钮时,可以执行以下代码来打开串口:

serialPort1.Open();

同样,对于关闭串口的按钮,可以执行以下代码:

serialPort1.Close();

需要注意的是,在打开和关闭串口之前需要先设置好串口号和波特率。

2. 串口数据接收和解析

当串口打开后,程序应该开始监听串口数据,并将接收到的数据显示在文本框控件上。

在C#中,可以通过以下事件处理函数来实现串口数据的接收和解析:

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    // 代码实现
}

在事件处理函数中,需要调用 BytesToRead 属性获取数据字节数,并调用 ReadExisting() 方法来读取数据。接着,可以将读取到的数据存储在一个字符串类型的变量中,并将该变量的值显示在文本框控件上。

实现代码如下:

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    int bytesToRead = serialPort1.BytesToRead;
    byte[] tempByte = new byte[bytesToRead];
    serialPort1.Read(tempByte, 0, bytesToRead);
    string receivedData = Encoding.Default.GetString(tempByte);
    this.Invoke((EventHandler)(delegate
    {
        textBox1.AppendText(receivedData);
    }));
}

三、示例演示

示例1:打开和关闭串口

private void button_OpenSerialPort_Click(object sender, EventArgs e)
{
    try
    {
        //设置串口号、波特率
        serialPort1.PortName = comboBox_PortName.Text;
        serialPort1.BaudRate = Convert.ToInt32(comboBox_BaudRate.Text);
        //设置数据位,停止位和校验位
        serialPort1.DataBits = 8;
        serialPort1.StopBits = StopBits.One;
        serialPort1.Parity = Parity.None;
        //打开串口
        serialPort1.Open();
        button_OpenSerialPort.Enabled = false;//打开后,打开按钮不可用
        button_CloseSerialPort.Enabled = true;//打开后,关闭按钮可用
    }
    catch
    {
        MessageBox.Show("串口打开失败!", "错误提示");
    }
}

private void button_CloseSerialPort_Click(object sender, EventArgs e)
{
    try
    { 
        serialPort1.Close();
        button_OpenSerialPort.Enabled = true;//关闭后,打开按钮可用
        button_CloseSerialPort.Enabled = false;//关闭后,关闭按钮不可用
    }
    catch
    {
        MessageBox.Show("串口关闭失败!", "错误提示");
    }
}

示例2:数据接收和解析

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    int bytesToRead = serialPort1.BytesToRead;
    byte[] tempByte = new byte[bytesToRead];
    serialPort1.Read(tempByte, 0, bytesToRead);
    string receivedData = Encoding.Default.GetString(tempByte);
    this.Invoke((EventHandler)(delegate
    {
        textBox1.AppendText(receivedData);
    }));
}

附C#实现串口监视上位机功能完整代码示例:

using System;
using System.IO.Ports;
using System.Text;
using System.Windows.Forms;

namespace SerialPortMonitor
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.Load += Form1_Load;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //加载COM口
            string[] str = SerialPort.GetPortNames(); //获取所有串口
            Array.Sort(str);    //进行排序
            comboBox_PortName.Items.AddRange(str);   //将串口号添加到组合框
            comboBox_PortName.SelectedIndex = comboBox_PortName.Items.Count > 0 ? 0 : -1;  //自动选择第一个

            //默认配置
            comboBox_BaudRate.SelectedIndex = 3;
            comboBox_DataBits.SelectedIndex = 0;
        }

        private void button_OpenSerialPort_Click(object sender, EventArgs e)
        {
            try
            {
                //设置串口号、波特率
                serialPort1.PortName = comboBox_PortName.Text;
                serialPort1.BaudRate = Convert.ToInt32(comboBox_BaudRate.Text);
                //设置数据位,停止位和校验位
                serialPort1.DataBits = Convert.ToInt32(comboBox_DataBits.Text);
                serialPort1.StopBits = (StopBits)Enum.Parse(typeof(StopBits), comboBox_StopBits.Text);
                serialPort1.Parity = (Parity)Enum.Parse(typeof(Parity), comboBox_Parity.Text);
                //打开串口
                serialPort1.Open();
                button_OpenSerialPort.Enabled = false;//打开后,打开按钮不可用
                button_CloseSerialPort.Enabled = true;//打开后,关闭按钮可用
            }
            catch
            {
                MessageBox.Show("串口打开失败!", "错误提示");
            }
        }

        private void button_CloseSerialPort_Click(object sender, EventArgs e)
        {
            try
            { 
                serialPort1.Close();
                button_OpenSerialPort.Enabled = true;//关闭后,打开按钮可用
                button_CloseSerialPort.Enabled = false;//关闭后,关闭按钮不可用
            }
            catch
            {
                MessageBox.Show("串口关闭失败!", "错误提示");
            }
        }

        private void button_SendData_Click(object sender, EventArgs e)
        {
            serialPort1.Write(textBox_SendData.Text);
        }

        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int bytesToRead = serialPort1.BytesToRead;
            byte[] tempByte = new byte[bytesToRead];
            serialPort1.Read(tempByte, 0, bytesToRead);
            string receivedData = Encoding.Default.GetString(tempByte);
            this.Invoke((EventHandler)(delegate
            {
                textBox_ReceiveData.AppendText(receivedData);
            }));
        }
    }
}

注:代码示例以Windows Forms应用程序为基础,在实际使用中,也可以将这些代码嵌入到其他应用程序中。同时,需要注意安装好.Net Framework后再运行本应用程序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# 实现简易的串口监视上位机功能附源码下载 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • C#版Windows服务安装卸载小工具

    C#版Windows服务安装卸载小工具是一种方便的工具,可以用于安装、卸载和管理Windows服务。以下是使用C#实现Windows服务安装卸载小工具的完整攻略。 环境准备 在使用C#实现Windows服务安装卸载小工具前,需要确保以下环境已经准备好: Visual Studio已经安装并配置好了环境变量。 项目中已经添加了引入的包的依赖。 实现Window…

    C# 2023年5月15日
    00
  • 举例讲解C#编程中委托的实例化使用

    下面是关于C#编程中委托的实例化使用的详细攻略: 什么是委托? 委托是一种能够存储对方法的引用的数据类型。在C#中,委托用于实现事件和回调函数,允许在程序运行时动态地将方法传递给其他方法作为参数。委托可以让C#编写者以更加灵活的方式处理事件和回调。 委托的实例化 在C#中,委托的实例化可以使用delegate关键字,指定委托类型、关联的方法名和该方法所在的对…

    C# 2023年5月31日
    00
  • C#实现只运行单个实例应用程序的方法(使用VB.Net的IsSingleInstance)

    实现只运行单个实例应用程序的方法,在C#中可以通过使用Mutex实现。Mutex是一种用于互斥访问共享资源的同步基元。在应用程序的运行过程中,只允许存在一个互斥体。如果进程试图创建同名的互斥体,则只能打开已存在的同名互斥体,而不是创建一个新的互斥体。 下面是实现只运行单个实例应用程序的方法的代码片段: using System.Threading; // 定…

    C# 2023年6月3日
    00
  • 程序员用搞笑个性签名

    程序员用搞笑个性签名完整攻略 为什么要用搞笑个性签名 在互联网上,每个人都有自己独特的个性,而作为程序员,一个好的搞笑个性签名可以向外界展示你不仅仅是一位技术专家,还是一个对生活有态度的人。同时,如果你的签名更具吸引力,会让你在招聘或社交场合中更容易引起别人的注意。 如何制作搞笑个性签名 制作搞笑个性签名不需要太多技术水平,只需要放松心情、善于创意、有想象力…

    C# 2023年6月8日
    00
  • C#中委托用法

    C#中委托是一种能够存储方法的一种类型。委托可以用来实现回调函数,事件处理程序和多路广播事件等。下面是C#中委托用法的完整攻略。 1.定义委托类型 在定义委托时,需要指定返回类型和参数列表,如下所示: delegate void MyDelegate(int x, int y); 表示MyDelegate是一种委托类型,接受两个int类型的参数,无返回值。 …

    C# 2023年6月1日
    00
  • C#中四步轻松使用log4net记录本地日志的方法

    C#中四步轻松使用log4net记录本地日志的方法 前言 在软件开发中,日志是一种不可或缺的手段来帮助开发人员了解程序运行情况以及查找问题。log4net是一个强大的日志工具,能够轻松地记录日志信息并提供良好的输出格式。在本文中,我们将会演示如何使用log4net记录本地日志。 步骤 以下步骤将详细介绍如何在C#中使用log4net记录本地日志。 1. 添加…

    C# 2023年6月1日
    00
  • C# Linq的Average()方法 – 计算序列中元素的平均值

    C#中的“Language-Integrated Query”(简称:Linq)是一种强大的查询技术,它提供了一种方便、快速、灵活的方法来查询各种数据源。Linq中有许多方法,其中一个非常常用的方法就是Average()。下面就让我们来详细了解一下Average()方法的使用和实现。 方法概述 Average()方法可以用于计算一个序列的平均数,支持对整数、…

    C# 2023年4月19日
    00
  • ASP.NET MVC前台动态添加文本框并在后台使用FormCollection接收值

    ASP.NET MVC是一种针对Web应用程序的Web框架,它支持使用C#或VB.NET编程语言来创建动态、响应性的Web应用程序。本文将详细介绍如何在ASP.NET MVC前台动态添加文本框并在后台使用FormCollection接收值的过程。 准备工作 在开始本文的教程之前,你需要进行以下准备工作: 首先,你需要安装Visual Studio 2017或…

    C# 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部