You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java与C#读取RS232串口数据结果不一致的技术问询

问题分析与解决方案

嘿,这个问题其实是C#和Java对字节类型的定义差异导致的数值显示不同,本质上两个程序读取到的二进制数据是完全一致的,只是解析成十进制数值的逻辑不一样:

  • C#里的byte是无符号8位整数,取值范围是0~255,所以串口返回的255、144这类大于127的数值会直接以正数形式显示。
  • Java里的byte是有符号8位整数,取值范围是-128~127。当串口返回的二进制值对应的十进制数大于127时,Java会把它解析为负数——计算方式很简单:用这个正数减去256。比如:
    • 二进制11111111对应十进制255,在Java里会显示为255 - 256 = -1
    • 二进制10010000对应十进制144,在Java里会显示为144 - 256 = -112

快速验证与修复

如果想让Java输出和C#一致的无符号数值,只需要把读取到的byte转换为无符号整数就行,核心是和0xFF做按位与操作:

// 示例:把Java读取到的有符号byte数组转为无符号数值
byte[] receivedData = {-1, 98, -112, 19, 1, 0};
for (byte b : receivedData) {
    int unsignedByteValue = b & 0xFF; // 关键一步,得到无符号的十进制值
    System.out.print(unsignedByteValue + ", ");
}

运行这段代码,输出会完全匹配C#的结果:255, 98, 144, 19, 1, 0。

结论

你的Java程序读取串口数据是完全正常的,只是语言本身对字节类型的定义差异造成了数值显示形式的不同。如果业务逻辑需要使用无符号的字节值,直接用上面的转换方法处理就行。

内容的提问来源于stack exchange,提问作者user7925257

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:13:45