C# 串口通信教程

news2024/11/23 8:48:02

串口通信(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# 中的串口通信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2224434.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Golang | Leetcode Golang题解之第508题出现次数最多的子树元素和

题目: 题解: func findFrequentTreeSum(root *TreeNode) (ans []int) {cnt : map[int]int{}maxCnt : 0var dfs func(*TreeNode) intdfs func(node *TreeNode) int {if node nil {return 0}sum : node.Val dfs(node.Left) dfs(node.Right)cnt[sum]if…

数字后端零基础入门系列 | Innovus零基础LAB学习Day6

今天没有具体的数字IC后端lab实验。今天的重点是熟悉掌握静态时序分析STA中的几类timing path以及setup和hold检查机制(包含setup和hold计算公式)。 芯片流片失败的那些故事 数字后端零基础入门系列 | Innovus零基础LAB学习Day5 等大家把今天内容学习…

设计模式(二)工厂模式详解

设计模式(二)工厂模式详解 简单工厂模式指由一个工厂对象来创建实例,适用于工厂类负责创建对象较少的情况。例子:Spring 中的 BeanFactory 使用简单工厂模式,产生 Bean 对象。 工厂模式简介 定义:工厂模式是一种创建…

Spring Boot框架下中小企业设备管理系统开发

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理中小企业设备管理系统的相关信息成为必然。…

Kafka-代码示例

一、构建开发环境 File > New > Project 选择一个最简单的模板 项目和坐标命名 配置maven路径 添加maven依赖 <dependencies><!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients --><dependency><groupId>org.apache.kaf…

最长子序列模型二(二分优化版)

文章目录 提高课题解一、拦截导弹二、导弹防御系统三、最长公共上升子序列四、二分函数速写 基础课题解五、最长上升子序列 II 提高课题解 一、拦截导弹 题目链接 第一问非常简单&#xff0c;直接用之前最长上身子序列模板就行 第二问就有难度了&#xff0c;我们要用最少的递…

基于SSM“毛毛宠物店”宠物信息交流平台的设计与实现

开发说明 开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myec…

DEV-C++如何调试

1、先编译&#xff0c;再点击“调试”按钮 2、使用调试按钮&#xff0c;可以输入输出数据 第21次发博客 以后会慢慢更新

【计网】从零开始认识IP协议 --- 认识网络层,认识IP报头结构

从零开始认识IP协议 1 网络层协议1.1 初步认识IP协议1.2 初步理解IP地址 2 IP协议报头3 初步理解网段划分 1 网络层协议 1.1 初步认识IP协议 我们已经熟悉了传输层中的UDP和TCP协议&#xff0c;接下来我们来接触网络层的协议&#xff1a; 网络层在计算机网络中的意义主要体现…

EXCELL中如何两条线画入一张图中,标记坐标轴标题?

1&#xff0c;打开excel&#xff0c;左击选中两列&#xff0c; 2&#xff0c;菜单栏>“插入”>”二维折线图”选中一个 3&#xff0c;选中出现的两条线中的一条右击>最下一行&#xff0c;“设置数据系列格式” 4&#xff0c;右测“系列选项中”>点击“次坐标轴” 5…

Java 开发——(上篇)从零开始搭建后端基础项目 Spring Boot 3 + MybatisPlus

一、概述 记录时间 [2024-10-23] 本文是一个基于 Spring Boot 3 MybatisPlus 的项目实战开发&#xff0c;主要涵盖以下几个方面&#xff1a; 从零开始的项目创建IDEA 中开发环境的热部署Maven、Swagger3、MybatisPlus 等的配置路由映射知识静态资源访问文件上传功能实现拦截器…

颐驰06持续交付,明日科技赋能出行生活

在全球智能出行领域&#xff0c;自动驾驶技术的发展一直是行业关注的焦点。不久前&#xff0c;特斯拉发布的自动驾驶出租车引发了全球关注&#xff0c;但由于缺乏具体的技术细节&#xff0c;导致投资者信心受挫&#xff0c;特斯拉股票一度下跌近10%。与此同时&#xff0c;中国车…

智能台灯设计(一)原理图设计

1. 前言 作者最近突发奇想&#xff0c;想自己做一个小台灯&#xff0c;设想的功能有&#xff1a;带锂电池可充电、可以调节亮度&#xff0c;后续通过增加WIFI模块实现手机控制开关功能。目前先实现最简单的功能&#xff0c;有时间再一步步完善吧。 2. 原理图设计 充电芯片使用…

常用的三角公式

目录 1. 基本公式​ 2. 倍角公式​ 3. 半角公式​ 4. 和差公式​ 5. 和差化积​ 6. 积化和差​ 7. 万能公式​ 1. 基本公式 2. 倍角公式 3. 半角公式 4. 和差公式 5. 和差化积 6. 积化和差 7. 万能公式

self-supervised learning(BERT和GPT)

1芝麻街与NLP模型 我們接下來要講的主題呢叫做Self-Supervised Learning&#xff0c;在講self-supervised learning之前呢&#xff0c;就不能不介紹一下芝麻街&#xff0c;為什麼呢因為不知道為什麼self-supervised learning的模型都是以芝麻街的人物命名。 因為Bert是一個非常…

第九部分 Java API

第九部分 Java API 9.1 Java Number & Math 9.1.1 Java Number类 一般地&#xff0c;当需要使用数字的时候&#xff0c;我们通常使用内置数据类型&#xff0c;如&#xff1a;byte、int、long、double 等。 实例 int a 5000; float b 13.65f; byte c 0x4a;然而&…

《云原生安全攻防》-- K8s攻击案例:权限维持的攻击手法

在本节课程中&#xff0c;我们将一起深入了解K8s权限维持的攻击手法&#xff0c;通过研究这些攻击手法的技术细节&#xff0c;来更好地认识K8s权限维持所带来的安全风险。 在这个课程中&#xff0c;我们将学习以下内容&#xff1a; K8s权限维持&#xff1a;简单介绍K8s权限维持…

VUE中文本域默认展示最底部内容

文本域内容 <textarea ref"textareaRef" style"width: 100%; resize: none;" readonly v-model"errorLog" rows"15"></textarea> 样式展示 this.$nextTick(() > { // 使用$refs获取文本域的DOM元素 const textareaInfo…

SwiftUI:单个App支持设置多语言

SwiftUI 全新多语言方案 简化本地化的字符串- WWDC21 - 视频 本地化您的SwiftUI app - WWDC21 - 视频 构建全球化App&#xff1a;本地化的示例- WWDC22 - 视频 构建支持多语言的App - WWDC24 - 视频 单个App支持设置多语言 工程 Info.plist里添加 键值UIPrefersShowingLangua…

解析三相220V与三相380V变频器的关键差异

在工业自动化的广阔舞台上&#xff0c;作为电力电子技术的杰出代表&#xff0c;扮演着调节电机速度、优化能源利用的重要角色。本文将深入探讨三相220V与三相380V变频器之间的九大核心区别&#xff0c;帮助读者更全面地理解这两种设备的应用特性。 一、电压等级&#xff1a;基础…