在java和c中读取时的不同串行结果#

在java和c中读取时的不同串行结果#,java,c#,serial-communication,Java,C#,Serial Communication,我有两个与串行rs232通信的程序 1.用c#编写,使用pf SerialPort类 2.使用librxtx-SerialPort类用java编写 两者:波特率-9600,奇偶校验无,停止位-1,数据位-8 它们与始终发送相同数据的设备进行通信 在c#中,我得到以下6个字节:255,98144,19,1,0 在java中,我得到以下6个字节:-1,98,-112,19,1,0 c代码是正确的 下面是c#的代码: 以下是java的代码: m_SerialPort = (SerialPort) co

我有两个与串行rs232通信的程序 1.用c#编写,使用pf SerialPort类 2.使用librxtx-SerialPort类用java编写

两者:波特率-9600,奇偶校验无,停止位-1,数据位-8

它们与始终发送相同数据的设备进行通信

在c#中,我得到以下6个字节:255,98144,19,1,0 在java中,我得到以下6个字节:-1,98,-112,19,1,0

c代码是正确的

下面是c#的代码:

以下是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
newValue = (value + 256) % 256

// (-1 + 256) % 256 = 255
//  (98 + 256) % 256 = 98 etc