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日

相关文章

  • .Net(c#)汉字和Unicode编码互相转换实例

    .Net(c#)汉字和Unicode编码互相转换实例 在 .Net(c#) 中,我们可以很方便地进行汉字和 Unicode 编码之间的转换。本文将为您介绍汉字和 Unicode 编码的基本概念,并提供两个示例说明。 汉字和 Unicode 编码 Unicode 编码是一种字符编码标准,它使用一个编号来表示每个字符。Unicode 编码可以用来表示汉字、英文字…

    C# 2023年6月1日
    00
  • 详解C#编程中一维数组与多维数组的使用

    详解C#编程中一维数组与多维数组的使用 一维数组的定义和使用 定义 一维数组是由相同类型元素组成的一组有序集合。这些元素在内存中按照一定的顺序依次存放。在C#中,我们可以通过以下语法来定义一个一维数组: <数据类型>[] <数组名> = new <数据类型>[<数组长度>]; 例如,定义一个长度为5的int类型…

    C# 2023年6月7日
    00
  • asp.net中调用oracle存储过程的方法

    调用Oracle存储过程是ASP.NET中经常用到的操作之一。下面我将尝试为您提供一份完整的攻略指导。 准备工作 在调用Oracle存储过程之前,您需要完成以下准备工作: 确认已经安装了Oracle Client,并且可以连接到Oracle数据库。 在Oracle数据库中创建一个存储过程。 调用存储过程 在ASP.NET中,调用Oracle存储过程有两种方法…

    C# 2023年6月3日
    00
  • Winform学生信息管理系统登陆窗体设计(1)

    下面是Winform学生信息管理系统登陆窗体设计的完整攻略。 一、设计思路 设计一个Winform学生信息管理系统登陆窗体需要以下几步: 新建一个Winform项目,添加登陆窗体。 设计登陆窗体的布局,包括添加组件,设置组件属性等。 为登陆窗体的组件添加事件处理程序,比如点击按钮触发登陆操作。 在事件处理程序中,编写验证登陆信息的代码,并执行相应的操作。 二…

    C# 2023年6月3日
    00
  • C#调用C++版本dll时的类型转换需要注意的问题小结

    以下是详细的攻略。 标题 “C#调用C++版本dll时的类型转换需要注意的问题小结” 前言 在C#开发中,调用C++版本的dll时,需要进行类型转换。若不注意,可能会出现类型转换错误,导致程序崩溃。因此需要注意一些问题。 正文 问题1:传递指针类型 在C#中无法直接传递C++中的指针类型,需要通过IntPtr类型进行转换。 例如,C++中的函数声明如下: v…

    C# 2023年5月15日
    00
  • .NET C#创建WebService服务简单实例

    .NET C#创建WebService服务简单实例 WebService是一种基于Web的分布式应用程序,它使用标准的Internet协议来通信。在.NET C#中,我们可以使用ASP.NET Web服务来创建WebService服务。本文将提供详细的“.NET C#创建WebService服务简单实例”的完整攻略,包括如何创建WebService服务、如何…

    C# 2023年5月15日
    00
  • ASP.NET Core MVC 从入门到精通之文件上传

    随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员。 经过前几篇文章的讲解,初步了解ASP.NET Core MVC项目创建,启…

    C# 2023年5月11日
    00
  • .Net Core中使用EFCore生成反向工程

    在 .NET Core 中,可以使用 Entity Framework Core (EF Core) 来生成反向工程。反向工程是指根据数据库中的表自动生成模型类和上下文类。以下是 .NET Core 中使用 EF Core 生成反向工程的完整攻略: 步骤一:安装 EF Core 工具 在使用 EF Core 生成反向工程前,需要在 .NET Core 项目中…

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