C#怎么枚举系统串口_C#如何实现串口通信发16进制数据【实战】

千墨吖_7393

千墨吖_7393

2026-05-05

907人浏览

原创

核心是避免write(string)将十六进制字符串误转为ascii字节,必须用write(byte[], int, int)发送经正确解析(去空格、校验、两位一转)的字节数组。

c#怎么枚举系统串口_c#如何实现串口通信发16进制数据【实战】

串口通信发 16 进制数据,核心不是“怎么转字符串”,而是“别让 Write(string) 悄悄给你转成 ASCII 字节”。只要走错这一步,接收端看到的永远是 0x30 0x31 0x20 0x30 0x33(即 `"01 03"` 的 ASCII 编码),而不是你想要的 0x01 0x03。

如何正确枚举可用串口(SerialPort.GetPortNames())

这是所有操作的前提,但容易被忽略权限或延迟问题:

  • SerialPort.GetPortNames() 返回的是当前系统识别到的 COMx 名称数组,不检查物理连接状态,也不触发驱动加载 —— 插着没通电的 USB 转串口设备也可能出现在列表里
  • 在 WinForms 中建议放在窗体 Load 事件里调用,但首次调用可能因系统缓存返回空数组;可加一次 Thread.Sleep(100) 后重试,或绑定到 SystemEvents.PowerModeChanged 事件监听热插拔
  • 某些虚拟串口(如 VSPE、com0com)或蓝牙串口可能需要管理员权限才能列出,普通用户账户下会静默跳过

怎么把 "01 03 00 FF" 这类字符串安全转成 byte[]

不能直接 Encoding.ASCII.GetBytes("01 03"),那是错的。必须剥离空格、校验合法性、按两位解析:

C#
C#

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

下载
  • 先用 .Replace(" ", "").Replace("0x", "").ToUpper() 清理格式,得到纯十六进制字符序列
  • 用正则 ^[0-9A-F]{2,}$ 校验 —— 注意必须是偶数长度,否则 Substring(x,2) 会越界
  • 推荐用 Convert.ToByte(str, 16) 解析每两位,比 int.Parse(..., NumberStyles.HexNumber) 更轻量且明确只接受两位
  • 示例片段:
    string input = "01 03 00 FF";<br>string clean = input.Replace(" ", "").ToUpper();<br>if (clean.Length % 2 != 0 || !Regex.IsMatch(clean, "^[0-9A-F]{2,}$"))<br>  throw new ArgumentException("非法十六进制字符串");<br>byte[] data = Enumerable.Range(0, clean.Length / 2)<br>  .Select(i => Convert.ToByte(clean.Substring(i * 2, 2), 16))<br>  .ToArray();

发送时为什么不能用 Write(string)?

因为 SerialPort.Write(string) 默认按当前 SerialPort.Encoding(通常是 UTF-8 或 ASCII)编码字符串,把每个字符当文本处理 —— 输入 "FF" 发出去的是 0x46 0x46('F' 的 ASCII 码),不是 0xFF。

  • 必须用 Write(byte[], int, int) 重载,传入真实字节数组
  • 如果从 TextBox 读取,务必确认用户输入的是十六进制字符串(如 "A1B2"),而不是想当然地把 "A1B2" 当作要发的原始字节流
  • 常见错误:用户输入 "0x01,0x03",代码没做预处理就直接切分,结果 Convert.ToByte("0x01", 16) 报异常 —— Convert.ToByte 不支持 0x 前缀,得先 .Replace("0x", "")

实际发包前最容易漏掉的三件事

硬件协议往往比代码逻辑更苛刻:

  • CRC/校验位:很多工业设备要求帧尾带 CRC16,例如 Modbus RTU。光发 01 03 00 00 00 01 不行,得补上计算出的两个字节,否则设备静默丢弃
  • 最小间隔:RS-485 半双工场景下,发送完一帧后需延时(如 3.5 字符时间)再发下一帧,否则从机收不到完整命令 —— Thread.Sleep 不可靠,要用基于波特率的精确等待
  • 接收缓冲区溢出:如果对方连续发数据,而你只靠 DataReceived 事件被动读,BytesToRead 可能瞬间飙高导致丢包;必须配合定时器或环形缓冲区做粘包处理,不能依赖单次 Read

真正卡住人的从来不是“怎么发”,而是“发过去之后对方认不认” —— 协议细节、电气特性、时序约束,这些不会报编译错误,但会让数据看起来“发了,又像没发”。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c#

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2023.08.08

992

5

什么是c#
什么是c#

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

2023.08.31

2851

3

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

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

2024.03.13

865

8

C#Task用法
C#Task用法

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

2024.03.14

2615

11

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

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

2026.02.03

312

18

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

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

2026.02.06

389

20

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

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

2026.03.11

631

24

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

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

2026.04.13

329

20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

6259

3

热门下载

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

精品课程

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

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

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

共0课时 | 0人学习