1

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

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 类发送未被干扰的字节?

4

1 回答 1

3

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

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

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

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

于 2012-05-29T10:39:24.997 回答