首页 > 编程语言 >C# 串口通信教程

C# 串口通信教程

时间:2024-10-22 16:51:18浏览次数:11  
标签:教程 Console C# 通信 serialPort WriteLine 串口 SerialPort

串口通信(Serial Communication)是一种用于设备之间数据传输的常见方法,通常用于与外部硬件设备(如传感器、机器人、微控制器)进行通信。在 C# 中,System.IO.Ports 命名空间提供了与串口设备交互的功能,可以轻松实现串口通信。

本教程将引导你如何在 C# 中实现串口通信,并展示一些常用的通信操作,如打开和关闭串口、读取和写入数据。

一、添加 System.IO.Ports 命名空间

在进行串口通信之前,需要导入 System.IO.Ports 命名空间,它提供了 SerialPort 类,用于串口操作:

using System.IO.Ports;

二、配置串口参数

在串口通信中,通常需要设置以下几个关键参数:

  • 串口号(Port Name):用于指定与哪个串口进行通信(如 COM1COM3)。
  • 波特率(Baud Rate):通信的速度,一般常见的值有 9600115200 等。
  • 数据位(Data Bits):数据传输的位数,一般为 8
  • 停止位(Stop Bits):一个字节结束后的停止位,一般为 1
  • 奇偶校验位(Parity):用于错误检测,一般为 None

以下是如何在 C# 中创建并配置 SerialPort 对象的示例代码:

SerialPort serialPort = new SerialPort();

// 设置串口号
serialPort.PortName = "COM3";

// 设置波特率
serialPort.BaudRate = 9600;

// 设置数据位
serialPort.DataBits = 8;

// 设置停止位
serialPort.StopBits = StopBits.One;

// 设置奇偶校验位
serialPort.Parity = Parity.None;

三、打开和关闭串口

在配置好串口参数之后,需要调用 Open 方法来打开串口。完成数据传输后,应使用 Close 方法关闭串口。

try
{
    // 打开串口
    serialPort.Open();
    Console.WriteLine("串口已打开");

    // 进行数据通信...
}
catch (Exception ex)
{
    Console.WriteLine($"无法打开串口: {ex.Message}");
}
finally
{
    // 关闭串口
    if (serialPort.IsOpen)
    {
        serialPort.Close();
        Console.WriteLine("串口已关闭");
    }
}

四、读取和写入数据

通过 SerialPort 类的 Read 和 Write 方法,可以从串口读取和写入数据。可以采用同步或异步的方式来进行数据通信。以下是一些常见的操作。

1. 同步写入数据

try
{
    if (serialPort.IsOpen)
    {
        string message = "Hello, Device!";
        serialPort.WriteLine(message); // 向串口写入数据
        Console.WriteLine($"已发送: {message}");
    }
}
catch (Exception ex)
{
    Console.WriteLine($"写入数据时出错: {ex.Message}");
}

2. 同步读取数据

try
{
    if (serialPort.IsOpen)
    {
        string receivedData = serialPort.ReadLine(); // 从串口读取数据
        Console.WriteLine($"收到: {receivedData}");
    }
}
catch (Exception ex)
{
    Console.WriteLine($"读取数据时出错: {ex.Message}");
}

3. 异步读取数据

为了避免阻塞程序,可以使用 DataReceived 事件异步接收数据。当串口收到数据时,该事件将被触发。

// 订阅 DataReceived 事件
serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

// 打开串口
serialPort.Open();

// 异步数据接收处理
private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    string receivedData = sp.ReadExisting();
    Console.WriteLine($"异步收到: {receivedData}");
}

五、错误处理和调试

在串口通信中,常见的错误包括无法打开串口、串口被占用、数据读取超时等。在调试串口通信时,可以使用以下几种方法:

  1. 捕获异常:使用 try-catch 语句来捕获和处理异常。
  2. 检查串口状态:通过 serialPort.IsOpen 属性检查串口是否已打开。
  3. 设置超时:可以通过 serialPort.ReadTimeout 和 serialPort.WriteTimeout 设置读写操作的超时时间。
serialPort.ReadTimeout = 500;  // 500 毫秒
serialPort.WriteTimeout = 500; // 500 毫秒

六、完整示例

以下是一个完整的串口通信示例,展示了如何打开串口、发送和接收数据,并处理常见的错误。

using System;
using System.IO.Ports;

class Program
{
    static void Main(string[] args)
    {
        SerialPort serialPort = new SerialPort();

        // 串口配置
        serialPort.PortName = "COM3";
        serialPort.BaudRate = 9600;
        serialPort.DataBits = 8;
        serialPort.StopBits = StopBits.One;
        serialPort.Parity = Parity.None;

        // 订阅数据接收事件
        serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

        try
        {
            // 打开串口
            serialPort.Open();
            Console.WriteLine("串口已打开");

            // 发送数据
            serialPort.WriteLine("Hello, Device!");
            Console.WriteLine("数据已发送");

            // 等待一段时间来接收数据
            Console.ReadLine();
        }
        catch (Exception ex)
        {
            Console.WriteLine($"串口通信出错: {ex.Message}");
        }
        finally
        {
            // 关闭串口
            if (serialPort.IsOpen)
            {
                serialPort.Close();
                Console.WriteLine("串口已关闭");
            }
        }
    }

    // 数据接收处理
    private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string receivedData = sp.ReadExisting();
        Console.WriteLine($"收到的数据: {receivedData}");
    }
}

七、总结

通过本教程,你学习了如何使用 C# 中的 SerialPort 类实现串口通信。关键步骤包括配置串口参数、打开和关闭串口、发送和接收数据。通过同步或异步的方式与串口设备通信,你可以轻松与外部硬件设备建立联系。

希望本教程能帮助你更好地理解和实现 C# 中的串口通信。

标签:教程,Console,C#,通信,serialPort,WriteLine,串口,SerialPort
From: https://blog.csdn.net/qq_45728381/article/details/143162808

相关文章

  • 使用PCL进行点云粗配准的教程
    点云配准是计算机视觉和机器人领域中的一个重要课题,旨在将不同来源的点云数据对齐,以构建完整的三维模型或进行环境理解。本文将介绍如何使用C++和PointCloudLibrary(PCL)进行点云的粗配准。一、点云配准简介点云配准分为粗配准和精配准。粗配准的目标是在未知的初始位置和姿......
  • Python教程:Python父类方法重写
    在Python中,子类可以通过定义与父类同名的方法来重写(Override)父类的方法。这种机制允许子类提供特定的实现,以替代从父类继承的通用实现。重写父类方法时,子类方法将覆盖父类方法的行为,但子类仍然可以访问父类方法的原始实现(如果需要的话)。以下是一个简单的示例,展示了如何在Py......
  • 海量大模型如何一键部署上云?函数计算 x ModelScope 社区给出答案
    作者:魔搭官方大模型在过去一年多时间里的一路技术狂奔,深刻的改变了今天模型和AI的整体应用生态,也给开发者提供纷繁复杂的模型选择。在多样化大模型的背后,OpenAI得益于在领域的先发优势,其API接口今天也成为了业界的一个事实标准。许多开源工具和框架,包括LlamaIndex,LangChain......
  • css中,我想把文章的第一行设置单独的样式
    背景:我想把文章的第一行设置单独的样式。方式1:我把第一行单独用一个p标签包裹。但是页面是响应式的,随着页面的缩放,第一行的文字被挤到第二行甚至第三行,完全不符合我的需求。于是,我思考,有没有什么css选择器,可以直接选中文章的第一行。结果还真被我找到了。/*伪元素选......
  • element-ui中,使用this.$message.success(“登录成功“),如何修改文字的样式呢?
    在element-ui中使用this.$message.success(“注册成功”);时,直接修改文字样式并没有暴露出很方便的接口,因为ElementUI的消息提示组件Message是通过JavaScript动态创建的。但是你可以通过以下方法自定义消息的样式:方法1:使用customClass属性ElementUI的Me......
  • 【IEEE独立出版(ISBN号:979-8-3315-2986-4) | 连续多届稳定检索 | 大咖云集 | IEEE计算智
    重要信息大会网站:https://ais.cn/u/VRr6Rf【投稿参会】大会时间:2024年12月13-15日大会地点:中国-广州截稿时间:以官网信息为准出版检索:IEEE出版,见刊后由出版社提交至IEEEXplore, EI,Scopus检索组织单位征稿主题参会方式1、作者参会:一篇录用文章允许1名作者免......
  • [ARC133E] Cyclic Medians 题解
    一点不会套路。思路对于中位数相关,发现我们不好直接表示与中位数有关的内容。不妨枚举\(x\),把大于\(x\)的标为\(1\),小于等于\(x\)的标为\(0\),这样把所有最终为一的方案数加起来就是原来的答案。大概是这样一个东西:\[k=\sum_{i=0}^k[i<k]\]这个怎么求呢。发现若一组......
  • 【西安理工大学主办,八大高校联合协办并重点推荐/品牌会议/JPCS独立出版,EI, Scopus稳定
    重要信息大会网站:https://ais.cn/u/2yymE3【投稿参会】截稿时间:以官网信息为准线下召开:2024年11月29日-12月1日会议地点:陕西·西安收录检索:EI,Scopus稳定双检索!征稿主题出版信息所录用的论文将以论文集形式递交JPCS出版,并提交至EICompendex,Scopus检索。......
  • Features of three electronic component platforms: Findchips, JLCPCB, and ICgoodF
    Thecharacteristicsofthreeelectroniccomponentplatforms:Findchips,JLCPCB,andICgoodFindareasfollows:Findchips:Powerfulsearchanddataintegrationfunction.Itcanaggregatedatafrommajordistributors.Userscansearchforinformationonse......
  • Scala的trait的用法
    ①只有抽象方法的trait②只有抽象成员和方法的trait③具体成员的变量和方法④对象继承特质例子://定义一个特质//特质可以有抽象属性,具体属性,抽象方法,具体方法traitBeauty{//抽象方法valhair:String//具体属性varage=18valheight=180//val不......