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日

相关文章

  • js获取Treeview选中的节点(C#选中CheckBox项)

    下面是如何用JavaScript获取TreeView选中的节点: 1. 使用querySelectorAll函数 // 获取全部被选中的复选框元素 const checkedNodes = document.querySelectorAll(‘input[type="checkbox"]:checked’); // 遍历复选框元素 che…

    C# 2023年6月6日
    00
  • C#调用动态库

    C#调用动态库是一种常见的操作,可以让我们在开发的过程中更加灵活。下面是一个详细的攻略,包含了基本概念、实际应用、代码示例等。 基本概念 在讲解C#调用动态库之前,有几个基本概念需要先了解一下: 动态链接库:一种特殊的库,不像静态链接库那样包含在可执行文件中,而是在程序运行时才会加载,也称为共享库。 调用规范:在C函数传递参数的过程中,有多种规范,包括std…

    C# 2023年5月14日
    00
  • javascript KeyDown、KeyPress和KeyUp事件的区别与联系

    JavaScript中的KeyDown、KeyPress和KeyUp都是键盘事件,但它们有着不同的用途和特点。 1. KeyDown事件 当用户在页面中按下键盘上的任意一个键时,就会触发KeyDown事件。KeyDown事件可以同时捕获特殊键,例如Ctrl、Shift、Alt、Tab等,还可以捕获功能键(F1~F12)。 下面是一个演示用JS实现监听按键功能…

    C# 2023年6月7日
    00
  • 一文带你了解C#操作MySql的方法

    一文带你了解C#操作MySQL的方法 准备工作 在使用C#操作MySQL数据库之前,需要先进行几个必要的准备工作: 安装MySQL数据库,可以去官网下载最新版本。 安装MySQL Connector/NET,在MySQL官网下载安装包即可。 在Visual Studio中创建一个新的C#项目。 连接MySQL数据库 在使用C#操作MySQL数据库之前,需要先…

    C# 2023年6月2日
    00
  • 一文掌握C# JSON(2023最新整理)

    一文掌握C# JSON(2023最新整理) 什么是JSON? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript的一个子集,可以被多种编程语言读取和写入。JSON格式最初由 Douglas Crockford 提出,现已成为一种公认的数据交换格式。 C#中使用JSON的方式 C#中有多种库可…

    C# 2023年5月31日
    00
  • C#实现多文件打包压缩(.Net Core)

    C#实现多文件打包压缩(.Net Core)的攻略主要包括以下步骤: 引入NuGet包 在Visual Studio中打开你的项目,在Solution Explorer中右键点击你的项目,选择Manage NuGet Packages。在NuGet包管理器中搜索并安装DotNetZip库,也可以在Package Manager Console中执行以下命令进…

    C# 2023年6月3日
    00
  • 深入理解C#之接口

    当我们需要定义一个规范或者一个协议,描述某个对象应该具有哪些能力时,可以使用接口。接口可以看做是一种特殊的抽象类,它没有任何实现,只用于描述对象应该有哪些能力。具体来说,一个接口是由一组抽象方法、属性、索引器和事件组成的。可以将接口看做一种契约,实现接口的类型需要履行这个契约,提供指定的能力。 以下是实现接口的基本语法: [public | internal…

    C# 2023年6月7日
    00
  • C#基础:Dispose()、Close()、Finalize()的区别详解

    标题:C#基础:Dispose()、Close()、Finalize()的区别详解 介绍:在C#中,Dispose()、Close()、Finalize()都是释放资源的方式,但是它们之间有着不同的使用场景和语义。本文将对这三者进行详细介绍,并给出使用示例。 正文:一、Dispose()Dispose()是一种显式释放资源的方法,它是IDisposable接…

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