C#基于WinForm实现串口通讯

下面是详细的C#基于WinForm实现串口通讯的攻略,包括必要的示例代码和步骤。

1. 前置知识

在进行串口通讯之前,需要掌握以下基本知识:

  • 串口的通信原理和相关协议
  • C#的基本语法和WinForm编程基础
  • .NET Framework中用于串口通讯的命名空间SerialPort的相关使用方法

2. 创建WinForm应用程序

首先,我们需要在Visual Studio中创建一个WinForm应用程序,可以按照以下步骤操作:

  1. 打开Visual Studio,点击“文件”->“新建”->“项目”,在弹出窗口中选择“Visual C#”->“Windows桌面”->“Windows窗体应用程序”。

  2. 给项目命名,点击“确定”按钮。

  3. 在设计器中拖拽一个按钮控件和一个文本框控件,分别用于发送数据和显示数据。设置它们的Name属性分别为“btnSend”和“txtReceived”,并设置文本框为只读模式。

3. 添加串口控件

在设计视图中,双击表单,在双击事件中添加如下代码:

using System.IO.Ports;

private void Form1_Load(object sender, EventArgs e)
{
    //获取所有可用串口
    string[] ports = SerialPort.GetPortNames();
    //将可用串口添加到下拉框控件中
    comboBox1.Items.AddRange(ports);
}

这段代码将获取可用的串口名,并将其添加到下拉框控件中,方便用户选择要使用的串口。

4. 实现串口通讯

在发送数据之前,必须先打开所选的串口。在“btnSend”按钮的Click事件中,添加以下代码:

private void btnSend_Click(object sender, EventArgs e)
{
    //检查串口是否已经打开
    if (serialPort1.IsOpen)
    {
        //获取用户输入的文本
        string message = txtSend.Text;
        //在文本框中显示发送的数据
        txtReceived.AppendText("Send: " + message + Environment.NewLine);
        //将数据发送
        serialPort1.Write(message);
    }
    else
    {
        MessageBox.Show("串口未打开!");
    }
}

在接收数据之前,必须先绑定串口对象的DataReceived事件,用于接收串口返回的数据。在WinForm的Load事件中添加以下代码:

private void Form1_Load(object sender, EventArgs e)
{
    //获取所有可用串口
    string[] ports = SerialPort.GetPortNames();
    //将可用串口添加到下拉框控件中
    comboBox1.Items.AddRange(ports);
    //绑定串口数据接收事件
    serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
}

然后实现DataReceived事件处理方法:

private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    string indata = sp.ReadExisting();
    this.Invoke(new Action(() =>
    {
        //在文本框中显示接收到的数据
        txtReceived.AppendText("Receive: " + indata + Environment.NewLine);
    }));
}

在用户选择要使用的串口之后,需要实例化SerialPort类,并设置正确的串口参数。在下拉框控件选中值改变的事件中,添加以下代码:

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    //关闭已打开的串口
    if (serialPort1.IsOpen)
    {
        serialPort1.Close();
    }

    //设置串口参数
    serialPort1.PortName = comboBox1.SelectedItem.ToString();
    serialPort1.BaudRate = 9600;
    serialPort1.DataBits = 8;
    serialPort1.Parity = Parity.None;
    serialPort1.StopBits = StopBits.One;

    //打开串口
    try
    {
        serialPort1.Open();
        MessageBox.Show("串口已打开!");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

示例1:基于Winform实现发送数据至串口

下面是一段简单的示例代码,演示基于WinForm实现将用户输入的文本发送至串口:

using System.IO.Ports;

public partial class Form1 : Form
{
    private SerialPort serialPort1;

    public Form1()
    {
        InitializeComponent();

        //实例化串口对象
        serialPort1 = new SerialPort();
        //设置串口的读写超时时间
        serialPort1.ReadTimeout = 1000;
        serialPort1.WriteTimeout = 1000;
        //绑定串口的数据接收事件
        serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
    }

    private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting();
        this.Invoke(new Action(() =>
        {
            //在文本框中显示接收到的数据
            txtReceived.AppendText("Receive: " + indata + Environment.NewLine);
        }));
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        //获取所有可用串口
        string[] ports = SerialPort.GetPortNames();
        //将可用串口添加到下拉框控件中
        comboBox1.Items.AddRange(ports);
    }

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        //关闭已打开的串口
        if (serialPort1.IsOpen)
        {
            serialPort1.Close();
        }

        //设置串口参数
        serialPort1.PortName = comboBox1.SelectedItem.ToString();
        serialPort1.BaudRate = 9600;
        serialPort1.DataBits = 8;
        serialPort1.Parity = Parity.None;
        serialPort1.StopBits = StopBits.One;

        //打开串口
        try
        {
            serialPort1.Open();
            MessageBox.Show("串口已打开!");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    private void btnSend_Click(object sender, EventArgs e)
    {
        //检查串口是否已经打开
        if (serialPort1.IsOpen)
        {
            //获取用户输入的文本
            string message = txtSend.Text;
            //在文本框中显示发送的数据
            txtReceived.AppendText("Send: " + message + Environment.NewLine);
            //将数据发送
            serialPort1.Write(message);
        }
        else
        {
            MessageBox.Show("串口未打开!");
        }
    }
}

示例2:基于Winform实现读取串口返回的数据

下面是一段简单的示例代码,演示基于WinForm实现读取串口返回的数据:

using System.IO.Ports;

public partial class Form1 : Form
{
    private SerialPort serialPort1;

    public Form1()
    {
        InitializeComponent();

        //实例化串口对象
        serialPort1 = new SerialPort();
        //设置串口的读写超时时间
        serialPort1.ReadTimeout = 1000;
        serialPort1.WriteTimeout = 1000;
        //绑定串口的数据接收事件
        serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
    }

    private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting();
        this.Invoke(new Action(() =>
        {
            //在文本框中显示接收到的数据
            txtReceived.AppendText("Receive: " + indata + Environment.NewLine);
        }));
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        //获取所有可用串口
        string[] ports = SerialPort.GetPortNames();
        //将可用串口添加到下拉框控件中
        comboBox1.Items.AddRange(ports);
    }

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        //关闭已打开的串口
        if (serialPort1.IsOpen)
        {
            serialPort1.Close();
        }

        //设置串口参数
        serialPort1.PortName = comboBox1.SelectedItem.ToString();
        serialPort1.BaudRate = 9600;
        serialPort1.DataBits = 8;
        serialPort1.Parity = Parity.None;
        serialPort1.StopBits = StopBits.One;

        //打开串口
        try
        {
            serialPort1.Open();
            MessageBox.Show("串口已打开!");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#基于WinForm实现串口通讯 - Python技术站

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

相关文章

  • c#测试本机sql运算速度的代码示例分享

    我来为你详细讲解如何测试本机 SQL 运算的速度。 一、准备工作 安装 SQL Server 数据库,并创建一个数据库。 安装 Visual Studio 并安装 .NET Core SDK。 在 Visual Studio 中创建一个 .NET Core 控制台应用。 二、测试代码 示例1:插入 1000 条数据并计算耗时 代码如下: using Syst…

    C# 2023年6月1日
    00
  • 在Asp.net core项目中使用WebSocket

    在 ASP.NET Core 项目中使用 WebSocket 的完整攻略 WebSocket 是一种在 Web 应用程序中实现实时通信的协议。在 ASP.NET Core 项目中使用 WebSocket 可以实现实时信的功能。下面是详细的攻略: 步骤1:创建 ASP.NET Core 项目 在 Visual Studio 中创建一个名为“WebSocketD…

    C# 2023年5月12日
    00
  • 向一个数组中插入一个1~100的随机数

    关于向一个数组中插入一个1~100的随机数的完整攻略,具体步骤如下: 1. 声明一个数组 首先,需要在代码中声明一个数组,以便随后向其中插入随机数。可以使用如下语句: int[] arr = new int[n]; 其中,n代表数组的长度。这里使用了Java语言,如果是其他语言,语法可能略有不同,但是思路还是一致的。 2. 生成随机数 接着,需要生成一个1~…

    C# 2023年6月8日
    00
  • C# 中使用 Exceptionless的方法

    下面是关于在C#中使用Exceptionless的方法的完整攻略。 1. 什么是Exceptionless? Exceptionless是一种针对.NET和JavaScript应用程序的实时错误跟踪和日志记录工具。它可以在应用程序运行时自动记录错误和异常,并提供实时通知和日志记录,以帮助开发人员快速诊断和解决问题。 2. 如何使用Exceptionless?…

    C# 2023年5月15日
    00
  • C# String.Concat()方法: 连接多个字符串

    C#的String.Concat()方法 String.Concat是C#中的一个字符串拼接方法,它可以将两个或多个字符串连接在一起,拼接后的结果是一个新的字符串。String.Concat方法位于System.String类中,因此可以通过字符串对象调用该方法。 使用方法 String.Concat方法可以接受多个参数,每个参数可以是一个字符串或者一个对象…

    C# 2023年4月19日
    00
  • C# Clear():从集合中移除所有元素

    C#中的Clear()方法是一个实例方法,通常用于清空某些数据结构中的元素,例如字符串、数组、集合等。以下是C# Clear()的完整攻略,包括用法、示例和注意事项。 用法 Clear()方法是通过.运算符调用的实例方法,该方法不接受参数,返回值为void类型。可以使用Clear()方法来清空String、StringBuilder、List、Diction…

    C# 2023年4月19日
    00
  • .NET Core对象池的应用:扩展篇

    .NET Core 对象池的应用:扩展篇 .NET Core 对象池是一种用于重用对象的机制,它可以提高应用程序的性能和可伸缩性。在 .NET Core 中,可以使用对象池来重用一些常用的对象,例如数据库连接、HTTP 请求等。本攻略将详细讲解 .NET Core 对象池的应用,包括如何扩展对象池以适应不同的需求。 1. 创建对象池 创建一个对象池,用于重用…

    C# 2023年5月17日
    00
  • C#特性-对象集合初始化器介绍

    C#特性-对象集合初始化器是一种简化代码编写的特性,可以快速且易于阅读地创建和初始化对象和集合。下面我们来详细讲解它的使用方法: 1. 对象初始化器 在使用对象初始化器的时候,可以直接在创建对象的同时,对其字段和属性进行赋值。下面是一个示例: public class Person { public string Name { get; set; } pub…

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