讲师中心 微信公众号
AI工具推荐 视频效率加速

c#如何使用串口通信_c#串口通信从入门到精通教程

落丽姑娘_5559

落丽姑娘_5559

发布时间:2026-04-01 15:36:33

|

351人浏览过

|

来源于php中文网

原创

SerialPort 初始化需先用GetPortNames()获取可用端口并过滤蓝牙设备,再逐个轻量探测(设超时后尝试Open/Close)确认可用性,最后用正式实例配置参数;DataReceived事件在IO线程触发,须注意线程安全、显式编码、二进制读取及帧解析;多串口需避免UI/日志资源冲突,合理设置ReceivedBytesThreshold;.NET6+需注意Linux/macOS不支持硬件流控及BaseStream不可写等跨平台差异。

c#如何使用串口通信_c#串口通信从入门到精通教程

SerialPort 类怎么初始化才不会一打开就报错

90% 的初学者第一次用 SerialPort 失败,不是代码写错了,而是端口根本没准备好就硬开。比如 COM3 实际不存在、被其他程序占用、或驱动未加载——这时调用 Open() 会直接抛 UnauthorizedAccessException 或 IOException。

正确做法是:先查、再试、最后连。

  • 用 SerialPort.GetPortNames() 获取当前可用端口列表,过滤掉蓝牙虚拟串口(如含 "Bluetooth" 或 "BTH")
  • 对每个端口做轻量探测:新建临时 SerialPort 实例 → 设置超时(ReadTimeout = 200, WriteTimeout = 200)→ 尝试 Open() → 立即 Close(),不发任何数据
  • 只在确认端口“可打开”后,才用正式实例配置完整参数(波特率、校验位等)并长期持有

别省这一步——自动识别端口不是锦上添花,而是避免用户手动填错 COMx 的刚需。

DataReceived 事件为什么收不到数据或乱码

这是最典型的线程陷阱:DataReceived 回调默认在**IO线程**触发,不是 UI 线程,也不是主线程。如果你在里面直接更新 TextBox.Text 或调用 Console.WriteLine(),轻则丢数据,重则界面卡死或抛 InvalidOperationException。

更隐蔽的问题是编码和缓冲区处理:

C#
C#

"避开 C# 常见错误——空陷阱、异步陷阱、LINQ 陷阱及资源泄漏。"

下载
  • 默认用 Encoding.ASCII 解码,但设备可能发 UTF-8 或 GB2312;建议显式指定 Encoding.UTF8 并统一收发编码
  • ReadExisting() 返回的是字符串,但串口是字节流;如果设备发的是二进制帧(比如含 0x00),它会被截断——此时必须用 Read(buffer, 0, bytesToRead)
  • 没有粘包/拆包逻辑:连续发两帧,DataReceived 可能一次回调里收到半帧+整帧,也可能两次回调各收半帧

简单方案:用 lock + byte[] 缓冲区累积原始字节,配合帧头(如 0xAA 0x55)、长度字段做解析,别依赖事件“刚好一帧一调用”。

多串口同时通信时资源冲突怎么办

一个 SerialPort 实例只能操作一个物理端口,但多个实例之间**不共享状态**,所以“同时开 COM3 和 COM4”本身没问题。真正出问题的点在于共享资源竞争:

  • UI 控件访问冲突:多个 DataReceived 回调都往同一个 ListBox 添加项 → 必须用 Invoke() 或 BeginInvoke() 序列化到 UI 线程
  • 日志文件写入冲突:多个串口共用一个 StreamWriter → 用 lock(fileLock) 包裹写入,或为每个端口配独立日志文件
  • CPU 占用飙升:每个串口都设高波特率(如 921600)+ 频繁回调 → 关闭 ReceivedBytesThreshold 默认值(1),改设为合理帧长(如 64),减少回调频次

别迷信“多线程=高性能”——串口本质是低速外设,盲目开多线程反而增加调度开销。多数场景下,一个后台 Task 轮询 BytesToRead 比堆一堆事件更稳。

.NET 6+ 下 SerialPort 的兼容性坑

从 .NET Core 3.1 开始,System.IO.Ports 被抽成独立 NuGet 包,但 Windows 上仍内置;到了 .NET 6+,微软修复了大量跨平台 bug,但遗留两个关键差异:

  • Linux/macOS 下不支持 Handshake(RTS/CTS 流控)和 BreakSignal,若设备强依赖硬件流控,得换 RS-485 转 USB 模块或改用软件流控(XON/XOFF)
  • BaseStream 在 .NET 5+ 中不可写——别试图用 Stream.ReadAsync() 替代 Read(),它会抛 NotSupportedException
  • Windows 上 SerialPort 仍基于 Win32 API,某些 USB 转串口芯片(如 CH340 的旧驱动)在高波特率下偶发丢帧,升级驱动比改代码更有效

真要跨平台,请提前用 #if NET6_0_OR_GREATER 隔离平台相关逻辑,别等到部署到 Linux 才发现 GetPortNames() 返回空数组。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
c#是什么意思
c#是什么意思

C#是一种通用的面向对象编程语言,它在.NET框架上运行,可用于开发各种类型的应用程序。本专题为大家提供c#相关的各种文章、以及下载和课程。

1072

2023.08.08

什么是c#
什么是c#

C#(读作C Sharp)是一种现代的、通用的、面向对象的编程语言。它由微软公司开发,于2000年首次发布,主要用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是一种类型安全和托管的编程语言,它结合了C++的强大性能和C语言的简单易学特点,并引入了许多新的特性和概念,如委托、属性、泛型和异步编程等,以提高开发效率和代码可维护性。

3111

2023.08.31

C#中base关键字的用法
C#中base关键字的用法

在C#中,base关键字用于访问当前类的基类成员,这包括基类的字段、属性、方法、构造函数、索引器以及事件。想了解更多C#的相关内容,可以阅读本专题下面的文章。

905

2024.03.13

C#Task用法
C#Task用法

Task在C#中是用于表示异步操作的对象,它位于System.Threading.Tasks命名空间中。想了解更多C#中各种用法的相关内容,可以阅读本专题下面的文章。

2635

2024.03.14

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

332

2026.02.03

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

429

2026.02.06

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

631

2026.03.11

C# Unity游戏开发与ECS架构实践
C# Unity游戏开发与ECS架构实践

本专题聚焦 C# 在 Unity 游戏开发中的应用,系统讲解 ECS(Entity-Component-System)架构设计、游戏对象管理、性能优化与内存控制策略。通过实际游戏案例,帮助开发者构建高性能、结构清晰的游戏系统,提高游戏开发效率与运行性能。

329

2026.04.13

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

20

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn