使用串行端口对象发送大于 0x7F 的字节

本文关键字:大于 0x7F 字节 串行端口 对象 | 更新日期: 2023-09-27 18:35:40

我需要通过串行端口发送字节,并希望使用C#类SerialPort的便利性来做到这一点。然而,它似乎有一个严格的限制,使用这个类通过串行端口发送原始字节,引用ASCIIEncode类文档:

ASCIIEncoding 对应于 Windows 代码页 20127。由于 ASCII 是 7 位编码,因此 ASCII 字符限制为最低的 128 个 Unicode 字符,从 U+0000 到 U+007F。如果使用 Encoding.ASCII 属性或 ASCIIEncoding 构造函数返回的默认编码器,则在执行编码操作之前,该范围之外的字符将替换为问号 (?)。

这不是我想要的。如果我的字节值大于0x7F我希望它作为该值发送,而不是编码为问号。我不能使用 UTF-8 编码,因为这会为我的接收设备不期望的字符引入更多字节。SerialPort.Write 方法(Char[]、Int32、Int32)和(在我看来很愚蠢)SerialPort.Write 方法(Byte[]、Int32、Int32)在传输之前对数据进行编码。

看起来我可以创建自己的 EncoderFallback 类,但据我了解,这只允许我指定另一个字符来代替"?",或者我假设这一点不正确?

那么是否有可能发送未通过 SerialPort 类插入的字节?

使用串行端口对象发送大于 0x7F 的字节

byte[]重载页面上有一条评论:

有关 ASCIIEncoding 和其他类型的编码的备注不适用于此重载。此重载使用字节数组,绕过编码。

(看起来这些编码备注是从 Write 的其他重载复制/粘贴的。这些重载 - 使用字符数组和字符串 - 确实使用编码)。

— Micah Copple (可能是用户 mjcopple - 应该能够"转发"声誉!