【问题标题】:Different Serial Result when reading in java and c#在 java 和 c# 中读取时的不同序列结果
【发布时间】:2018-04-03 11:42:47
【问题描述】:

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

两者:BaudRate - 9600、Parity-None、StopBits - 1、DataBits - 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# serial-communication


    【解决方案1】:

    请注意,Java 和 C# 中的 byte[] 不同主要有两个原因:

    • Java byte 类型是有符号的,而 C# byte 类型是无符号的(如果需要有符号则使用 sbyte 类型)
    • Java 将字节存储为 Big Endian,而 C# 默认使用 Little Endian

    由于 java 在语言中不包含无符号字节,您可以通过以下方式打印到 int 的转换:

    byte b = 0x3a;    // random value
    return b & 0xFF;
    

    【讨论】:

      【解决方案2】:

      java 字节有符号,而 C# 字节没有。

      使用以下内容转换每个 java 值:

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

      【讨论】:

        猜你喜欢
        • 2021-12-25
        • 2014-09-18
        • 1970-01-01
        • 1970-01-01
        • 2011-12-27
        • 1970-01-01
        • 1970-01-01
        • 2017-05-12
        • 2011-03-13
        相关资源
        最近更新 更多