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日

相关文章

  • 常用类之TCP连接类-socket编程

    下面是关于“常用类之TCP连接类-socket编程”的完整攻略。 1. TCP连接类介绍 在进行socket网络编程时,我们需要使用到TCP连接类,该类被封装成了Python的socket库。它是一种基于客户机/服务器模式的、可靠的、面向连接的、传输层通信协议,它在应用层和TCP/IP协议族的传输层之间进行数据传输。使用TCP连接类,我们可以轻松实现实时通信…

    C# 2023年6月7日
    00
  • C# WinForm程序处理后台繁忙导致前台控件假死现象解决方法

    背景介绍C# WinForm程序处理后台繁忙导致前台控件假死现象,是C#程序员常见的问题之一。为了提升程序的用户体验,我们需要采取措施解决此问题。 解决方法①使用多线程异步处理:在C# WinForm程序中,多线程是解决后台繁忙导致前台假死的最好方法。我们可以使用C#语言内置的多线程操作来实现此功能。例如采用BackgroundWorker组件实现异步处理。…

    C# 2023年5月31日
    00
  • 聊一聊redis十种数据类型及底层原理

    概述 Redis 是一个开源的高性能键值数据库,它支持多种数据类型,可以满足不同的业务需求。本文将介绍 Redis 的10种数据类型,分别是 string(字符串) hash(哈希) list(列表) set(集合) zset(有序集合) stream(流) geospatial(地理) bitmap(位图) bitfield(位域) hyperloglog…

    C# 2023年5月9日
    00
  • .net实现动态验证码功能

    下面是“.net实现动态验证码功能”的完整攻略: 1. 概述 动态验证码功能可以有效防止自动化脚本恶意攻击网站。一般而言,动态验证码通过生成一组数字或字母等随机字符,将其显示在网站页面上,并要求用户输入该组字符,以验证用户的真实性。 在.NET平台上,我们可以使用C#等开发语言实现动态验证码功能。具体而言,需要实现以下工作: 生成一组随机字符; 将这组字符显…

    C# 2023年5月31日
    00
  • c# 实现位图算法(BitMap)

    C# 实现位图算法(BitMap)攻略 什么是位图算法 位图算法(BitMap),也称为比特映射算法。是一种基于位运算的数据结构。 它的原理是把数据映射到包含这些数据的整数范围内,利用0和1的二进制方式来记录数据是否出现过。当数据量庞大时,时间复杂度远低于其他数据结构,所以在一些需要高效的场景中应用广泛。 例如,在搜索引擎的爬虫程序中,经常需要对已爬取的网页…

    C# 2023年6月8日
    00
  • C#如何打开并读取usb的文件目录

    下面是关于如何打开并读取USB设备文件目录的攻略。 准备工作 在进行USB设备的文件操作之前,需要引用系统命名空间using System.IO,此外,需要在项目中添加UAC虚拟化(USB)来授权对USB的读取操作。 打开USB设备文件目录 可以使用DirectoryInfo的静态方法GetDirectories和GetFiles来获取指定目录下的文件和子目…

    C# 2023年6月1日
    00
  • C# FileStream实现多线程断点续传

    C# FileStream 实现多线程断点续传攻略 简介 多线程断点续传是指在文件下载或上传中,当中途中断或者被意外关闭时,可以重新连上之前的下载或上传进度,从中断处继续进行操作。在C#中,我们可以利用FileStream这个类来实现多线程断点续传,这个类可以以字节流的形式读取或写入文件,并且可以通过设置偏移量来实现文件的分段读写。 在下面的攻略中,我们将讲…

    C# 2023年5月15日
    00
  • C# 使用相同权限调用 cmd 传入命令的方法

    为了在C#中以相同权限调用cmd传入命令,以下是步骤: 创建一个ProcessStartInfo对象来设置启动进程时使用的属性,包括ProcessStartInfo对象的文件名和WorkingDirectory属性。WorkingDirectory属性是命令执行的起始目录。 通过Process类,创建一个转到cmd.exe的进程。 在cmd.exe进程中,输…

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