OutputStreamWriter 不适合发送十六进制或原始字节,因其面向字符、需经编码转换,无法直接表示如 0xFF 的非法 Unicode 字符;应直接使用 OutputStream 写入 byte[],并提供 hex 字符串解析为字节数组的方法。

OutputStreamWriter 本身不直接支持串口通信,也不能直接发送十六进制(Hex)数据——它是一个字符流写入器,作用是将字符(char)按指定编码(如 UTF-8、ISO-8859-1 或 US-ASCII)转换为字节,再写入底层 OutputStream。而串口通信需要的是字节流(byte),且常需精确控制原始字节(比如发 0x02、0x03 等控制码)。因此,**不能直接用 OutputStreamWriter 发送 Hex 数据,也不推荐用它发纯 ASCII 控制指令**。
为什么 OutputStreamWriter 不适合发 Hex/原始字节
OutputStreamWriter 是面向字符的:它把 char → 编码后的 byte[] → 写入 OutputStream。如果你传入字符 'A'(Unicode U+0041),它会按编码规则转成对应字节(如 ASCII 下就是 0x41);但如果你本意是发送字节 0xFF,它无法直接表示——因为 0xFF 不是合法的 Unicode 字符(超出 BMP 且非代理对),强行转会导致乱码、替换符()或异常(如 MalformedInputException)。
正确做法:用 OutputStream 直接写 byte[]
串口通信库(如 RXTX、jSSC、PureJavaComm 或 JSerialComm)返回的都是 OutputStream 实例。你应该绕过字符流,直接操作字节:
- ASCII 字符串 → 转为字节数组:
"AT ".getBytes(StandardCharsets.US_ASCII) - 十六进制字符串(如 "02 03 FF")→ 先解析为 byte[],再 write
- 单个字节或字节数组 → 直接调用
outputStream.write(byteArray)
如何把 Hex 字符串转成 byte[] 并发送
例如你有一段十六进制字符串 "0203FF"(无空格)或 "02 03 FF"(带空格),可用以下方式解析:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
简单工具方法(不依赖第三方库):
public static byte[] hexStringToBytes(String hex) {
hex = hex.replaceAll("\s+", ""); // 去空格
if (hex.length() % 2 != 0) throw new IllegalArgumentException("Hex string must have even length");
byte[] bytes = new byte[hex.length() / 2];
for (int i = 0; i < bytes.length; i++) {
int index = i * 2;
int value = Integer.parseInt(hex.substring(index, index + 2), 16);
bytes[i] = (byte) value;
}
return bytes;
}使用示例:
outputStream.write(hexStringToBytes("02 03 FF"));outputStream.write("Hello".getBytes(StandardCharsets.US_ASCII));- 记得调用
outputStream.flush()确保立即发出
如果坚持要用 OutputStreamWriter(仅限纯文本 ASCII)
仅当你要发送可打印 ASCII 文本(如 AT 命令、协议中的人类可读字段),且串口设备明确要求以某种字符编码接收时才考虑。此时:
- 创建时指定编码:
new OutputStreamWriter(outputStream, StandardCharsets.US_ASCII) - 写字符串:
writer.write("AT+RST "); writer.flush(); - ⚠️ 注意:
会被编码为0x0D 0x0A(符合 ASCII),但无法写0x00、0x02等控制字节
不复杂但容易忽略:串口不是文件,它对时序、字节精度、结束符( / )、缓冲区刷新都很敏感。优先用 OutputStream 写原始字节,更可控、更通用。

















