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# Winform实现自定义漂亮的通知效果

    下面是C# Winform实现自定义漂亮的通知效果的完整攻略。 目录 前言 准备工作 实现步骤 示例说明一 示例说明二 总结 前言 在Winform应用程序中,通知窗口往往是用MessageBox来实现的。但是MessageBox的样式过于单一,且不支持自定义,使用不够灵活。本文将介绍如何使用C#的Winform技术实现自定义漂亮的通知效果。 准备工作 Vi…

    C# 2023年6月1日
    00
  • 基于John Carmark密码详解

    基于John Carmack密码详解 什么是John Carmack密码? John Carmack密码,也称为“DooM3密码”,是由游戏开发者John Carmack在2004年所创造的密码。这种密码的特点在于:使用了MD5哈希加密算法,并且还有一些特殊的操作。 John Carmack密码的组成 John Carmack密码由以下几个部分组成: 一个固…

    C# 2023年6月7日
    00
  • C# FileStream简单介绍和使用

    C# FileStream简单介绍和使用 简介 FileStream是C#中用于文件操作的类之一,它可以对文件进行读写操作。使用FileStream类操作文件时,首先需要创建FileStream的实例,然后使用该实例的方法来进行文件读写操作。 创建FileStream实例 在创建FileStream实例时,要指定文件路径和文件模式。文件模式可以是读模式、写模…

    C# 2023年6月1日
    00
  • C#实现进制转换

    C#实现进制转换的完整攻略 在C#中,要实现进制转换可以使用Convert类提供的方法,主要有以下三个: ToInt32:将指定的字符串转换为32位带符号整数。 ToString:将指定的数字转换为字符串。 Parse:将字符串表示形式转换为等效的数字表示形式。 十进制转二进制 定义一个十进制数 int number = 123; 将其转换为二进制数 str…

    C# 2023年6月6日
    00
  • c# RSA非对称加解密及XML&PEM格式互换方案

    关于“c#RSA非对称加解密及XML&PEM格式互换方案”的攻略,我们可以分为以下几个部分进行讲解: 1. RSA非对称加解密原理介绍 1.1 RSA加密原理 RSA加密公式为:$C = M ^ e$ mod $N$,其中: C为密文 M为明文 e为公钥,表示加密的指数 N为公钥,表示模数 mod为取模运算 1.2 RSA解密原理 RSA解密公式为:…

    C# 2023年5月15日
    00
  • ext combobox动态加载数据库数据(附前后台)

    下面是详细的“ext combobox动态加载数据库数据(附前后台)”攻略。 什么是 ext combobox? ext combobox 是一种基于 ExtJS 框架开发的下拉菜单组件,它可以非常方便的实现下拉菜单的各种交互功能,同时也可以动态加载数据库数据实现自动填充下拉列表。 ext combobox 动态加载数据库数据操作步骤 创建数据库表 我们需要…

    C# 2023年5月31日
    00
  • Unity实现俄罗斯方块(二)

    Unity实现俄罗斯方块(二)攻略 1. 前言 在上一篇文章《Unity实现俄罗斯方块(一)》中,我们实现了俄罗斯方块游戏的基本框架,包括生成指定形状的方块、方块下落、方块旋转、消行等基本功能。接下来,我们在这个基础上,继续实现俄罗斯方块游戏的其他功能,包括左右移动和加速下落。 下面,我们就一步一步来详细讲解如何实现这些功能。 2. 左右移动 在俄罗斯方块游…

    C# 2023年6月1日
    00
  • ASP.NET Core整合Zipkin链路跟踪的实现方法

    ASP.NET Core整合Zipkin链路跟踪的实现方法 Zipkin是一个开源的分布式跟踪系统,可以帮助我们跟踪应用程序中的请求,并分析请求的性能和延迟。在本攻略中,我们将介绍如何在ASP.NET Core应用程序中整合Zipkin链路跟踪,并提供两个示例说明。 准备工作 在使用Zipkin链路跟踪之前,我们需要完成以下准备工作: 安装Zipkin。 我…

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