在 java 和 c# 中读取时出现不同的序列结果
Different Serial Result when reading in java and c#
我有两个与串行 rs232 通信的程序
1. 用 c# 编写,使用 pf SerialPort class
2. 使用 librxtx - SerialPort class
用 java 编写
两者:波特率 - 9600,奇偶校验 -None,停止位 - 1,数据位 - 8
他们与相同的设备通信,始终发送相同的数据
在 c# 中,我得到以下 6 个字节:255,98,144,19,1,0
在 java 中,我得到以下 6 个字节:-1,98,-112,19,1,0
C# 代码是正确的。
这里是 c# 的代码:
m_serialPort = new SerialPort("COM15", 9600, Parity.None, 8, StopBits.One);
m_serialPort.DataReceived += SPDataRecieved;
m_serialPort.Open();
public override void SPDataRecieved(object sender, SerialDataReceivedEventArgs e)
{
try
{
Thread.Sleep(80);
byte[] toBytes = new byte[6];
m_serialPort.Read(toBytes, 0, 6);
}
catch (Exception ex)
{
}
}
}
这里是 java 的代码:
m_SerialPort = (SerialPort) commPort;
m_SerialPort.setSerialPortParams
(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
InputStream in = m_SerialPort.getInputStream();
byte[] buffer = new byte[6];
int len = -1;
Thread.sleep(80);
len = in.read(buffer,0,6);
我需要在 java 代码中添加什么才能使结果相同?
请注意 Java 和 C# 中的 byte[]
有两个主要原因:
- Java字节类型是有符号的,而C#字节类型是无符号的(如果需要有符号使用sbyte类型)
- Java字节存储为Big Endian,而C#默认使用Little Endian
由于 java 语言中不包含无符号字节,您可以按以下方式打印到 int 的转换:
byte b = 0x3a; // random value
return b & 0xFF;
java 字节有符号,而 C# 字节没有。
使用以下内容转换每个 java 值:
newValue = (value + 256) % 256
// (-1 + 256) % 256 = 255
// (98 + 256) % 256 = 98 etc
我有两个与串行 rs232 通信的程序 1. 用 c# 编写,使用 pf SerialPort class 2. 使用 librxtx - SerialPort class
用 java 编写两者:波特率 - 9600,奇偶校验 -None,停止位 - 1,数据位 - 8
他们与相同的设备通信,始终发送相同的数据
在 c# 中,我得到以下 6 个字节:255,98,144,19,1,0 在 java 中,我得到以下 6 个字节:-1,98,-112,19,1,0
C# 代码是正确的。
这里是 c# 的代码:
m_serialPort = new SerialPort("COM15", 9600, Parity.None, 8, StopBits.One);
m_serialPort.DataReceived += SPDataRecieved;
m_serialPort.Open();
public override void SPDataRecieved(object sender, SerialDataReceivedEventArgs e)
{
try
{
Thread.Sleep(80);
byte[] toBytes = new byte[6];
m_serialPort.Read(toBytes, 0, 6);
}
catch (Exception ex)
{
}
}
}
这里是 java 的代码:
m_SerialPort = (SerialPort) commPort;
m_SerialPort.setSerialPortParams
(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
InputStream in = m_SerialPort.getInputStream();
byte[] buffer = new byte[6];
int len = -1;
Thread.sleep(80);
len = in.read(buffer,0,6);
我需要在 java 代码中添加什么才能使结果相同?
请注意 Java 和 C# 中的 byte[]
有两个主要原因:
- Java字节类型是有符号的,而C#字节类型是无符号的(如果需要有符号使用sbyte类型)
- Java字节存储为Big Endian,而C#默认使用Little Endian
由于 java 语言中不包含无符号字节,您可以按以下方式打印到 int 的转换:
byte b = 0x3a; // random value
return b & 0xFF;
java 字节有符号,而 C# 字节没有。
使用以下内容转换每个 java 值:
newValue = (value + 256) % 256
// (-1 + 256) % 256 = 255
// (98 + 256) % 256 = 98 etc