使用 jSerialComm 库的 Java 程序中存在数据损坏问题,但在 C# 中则没问题

问题描述 投票:0回答:1

我有一个Java程序,它与各种设备通信以通过串行通信检索数据。我正在使用 jSerialComm 库来实现此目的。

但是,当我使用此 Java 程序从特定设备检索数据时,数据似乎已损坏。

令人惊讶的是,当我使用没有任何外部库的 C# 程序从同一设备检索数据时,数据被正确接收,没有任何损坏。

设备配置设置如下:

Port: COM3
BaudRate: 2400
Parity: EVEN
Databits: 7
Stopbits: 1
  • 在我的 Java 程序中,我使用 jSerialComm 库,而在 C# 程序中,我没有使用任何外部库。

  • 我的Java程序可以使用相同的通信设置成功检测并检索来自其他设备的正常数据。数据损坏问题似乎是特定于该特定设备的。

我比较了两个程序的日志,发现 C# 程序始终接收预期的数据,而 Java 程序始终从该特定设备接收损坏的数据。我也尝试过修改Java程序中的波特率和奇偶校验设置,但问题仍然存在。

Java程序连接设备:

SerialPort[] serialPorts = SerialPort.getCommPorts();
for (SerialPort port : serialPorts) {
                if (DEVICE_PORT.equals(port.getSystemPortName())) {
                    bolFound = true;
                    serialPort = port;
                    try {
                        log.info("Opening port '" + DEVICE_PORT + "'...");
                        log.info("Connecting to device '" + DEVICE_NAME + "'...");

                        serialPort.setComPortParameters(DEVICE_RATE, DEVICE_DATABITS, DEVICE_STOPBITS, DEVICE_PARITY);
                        serialPort.addDataListener(this);
                        serialPort.openPort();

...........

Java数据监听:

@Override
public int getListeningEvents() {
    return SerialPort.LISTENING_EVENT_DATA_AVAILABLE;
}

@Override
public void serialEvent(SerialPortEvent event) {
    switch (event.getEventType()) {
        case SerialPort.LISTENING_EVENT_DATA_AVAILABLE:
            readComm();
            break;
        default:
            log.info("XXX default");
            break;
    }
}

@Override
public void readComm() {
    log.info(AppConfig.getInstance().getProperty(AppConfig.KEY_TEST_PORT, String.class) + " Reading Comm...");
    byte[] readBuffer = new byte[1024];
    try {
        inputStream = serialPort.getInputStream();
        int len = 0;
            
        while ((len = inputStream.read(readBuffer)) != -1) {
            log.info("Real Time Response:" + new String(readBuffer, 0, len));
            value += new String(readBuffer, 0, len);
            break;
        }
        log.info("value:" + value);

        if (isDataReady) {
            // process data
            value = ""; //reset data
        }

    } catch (IOException e) {
        intNumberOfFailure++;
    }
}

Java 程序日志文件:

2023-11-09 10:38:58.165  INFO 21320 [Thread-117 thread] h.h.c.v.l.BaseListener                   : Trying to init Test Listener (COM5)...
2023-11-09 10:38:58.350  INFO 21320 [Thread-117 thread] h.h.c.v.l.BaseListener                   : Opening port 'COM5'...
2023-11-09 10:38:58.350  INFO 21320 [Thread-117 thread] h.h.c.v.l.BaseListener                   : Connecting to device 'Testing'...
2023-11-09 10:38:58.350  INFO 21320 [Thread-117 thread] h.h.c.v.l.BaseListener                   : Opening port 'COM5' Success
2023-11-09 10:38:58.350  INFO 21320 [Thread-117 thread] h.h.c.v.l.BaseListener                   : Connecting to device 'Testing' Success
2023-11-09 10:38:59.211  INFO 21320 [Thread-120 thread] h.h.c.v.l.TestListener                   : COM5 Reading Comm...
2023-11-09 10:38:59.215  INFO 21320 [Thread-120 thread] h.h.c.v.l.TestListener                   : Real Time Response:[ 
2023-11-09 10:38:59.217  INFO 21320 [Thread-120 thread] h.h.c.v.l.TestListener                   : value:[ 
2023-11-09 10:38:59.219  INFO 21320 [Thread-120 thread] h.h.c.v.l.TestListener                   : COM5 Reading Comm...
2023-11-09 10:38:59.221  INFO 21320 [Thread-120 thread] h.h.c.v.l.TestListener                   : Real Time Response:l
2023-11-09 10:38:59.222  INFO 21320 [Thread-120 thread] h.h.c.v.l.TestListener                   : value:[ l
2023-11-09 10:38:59.225  INFO 21320 [Thread-120 thread] h.h.c.v.l.TestListener                   : COM5 Reading Comm...
2023-11-09 10:38:59.227  INFO 21320 [Thread-120 thread] h.h.c.v.l.TestListener                   : Real Time Response:@ 1
2023-11-09 10:38:59.229  INFO 21320 [Thread-120 thread] h.h.c.v.l.TestListener                   : value:[ l@   1
2023-11-09 10:39:00.215  INFO 21320 [Thread-120 thread] h.h.c.v.l.TestListener                   : COM5 Reading Comm...
2023-11-09 10:39:00.215  INFO 21320 [Thread-120 thread] h.h.c.v.l.TestListener                   : Real Time Response:{=Um%
2023-11-09 10:39:00.226  INFO 21320 [Thread-120 thread] h.h.c.v.l.TestListener                   : value:[ l@   1{=Um%
2023-11-09 10:39:00.230  INFO 21320 [Thread-120 thread] h.h.c.v.l.TestListener                   : COM5 Reading Comm...
2023-11-09 10:39:00.232  INFO 21320 [Thread-120 thread] h.h.c.v.l.TestListener                   : Real Time Response:l
2023-11-09 10:39:00.232  INFO 21320 [Thread-120 thread] h.h.c.v.l.TestListener                   : value:[ l@   1{=Um%l
2023-11-09 10:39:00.236  INFO 21320 [Thread-120 thread] h.h.c.v.l.TestListener                   : COM5 Reading Comm...
2023-11-09 10:39:00.237  INFO 21320 [Thread-120 thread] h.h.c.v.l.TestListener                   : Real Time Response: ,a
2023-11-09 10:39:00.238  INFO 21320 [Thread-120 thread] h.h.c.v.l.TestListener                   : value:[ l@   1{=Um%l ,a
2023-11-09 10:39:00.241  INFO 21320 [Thread-120 thread] h.h.c.v.l.TestListener                   : COM5 Reading Comm...
2023-11-09 10:39:00.242  INFO 21320 [Thread-120 thread] h.h.c.v.l.TestListener                   : Real Time Response: 
2023-11-09 10:39:00.243  INFO 21320 [Thread-120 thread] h.h.c.v.l.TestListener                   : value:[ l@   1{=Um%l ,a 
2023-11-09 10:39:01.202  INFO 21320 [Thread-120 thread] h.h.c.v.l.TestListener                   : COM5 Reading Comm...
2023-11-09 10:39:01.217  INFO 21320 [Thread-120 thread] h.h.c.v.l.TestListener                   : Real Time Response:  
2023-11-09 10:39:01.217  INFO 21320 [Thread-120 thread] h.h.c.v.l.TestListener                   : value:[ l@   1{=Um%l ,a   

C#程序连接设备:

string portName = "COM3";
int baudRate = 2400;
Parity parity = Parity.Even;
int dataBits = 7;
StopBits stopBits = StopBits.One;

_serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits);

_serialPort.DataReceived += SerialPort_DataReceived;

_serialPort.Open();

C#程序数据监听:

Console.WriteLine("Serial port opened. Press Enter to stop reading.");
        _logWriter = new StreamWriter("log.txt", true);

        while (true)
        {
            if (_serialPort.BytesToRead > 0)
            {
                string data = _serialPort.ReadExisting();
                DateTime now = DateTime.Now;

                string logMessage = $"[{now}] Received data: {data}";

                Console.WriteLine(logMessage);
                _logWriter.WriteLine($"[{now}] Received data: {data}");
                _logWriter.Flush(); // Flush the buffer to ensure data is written immediately

            }
        }

C# 程序日志文件:

[09/11/2023 10:53:09] Received data: US,+000091.50 kg

[09/11/2023 10:53:09] Received data: US,+000091.50 kg

[09/11/2023 10:53:10] Received data: US,+000091.50 kg

[09/11/2023 10:53:10] Received data: US,+000091.50 kg

[09/11/2023 10:53:10] Received data: S
[09/11/2023 10:53:10] Received data: T,+171.4 cm

[09/11/2023 10:53:11] Received data: ST,+000091.50 kg

[09/11/2023 10:53:11] Received data: US,+0000
[09/11/2023 10:53:11] Received data: 91.50 kg

[09/11/2023 10:53:12] Received data: US,+000091.50 kg

[09/11/2023 10:53:12] Received data: US,+000091.50 kg

[09/11/2023 10:53:13] Received data: US,+00
[09/11/2023 10:53:13] Received data: 0091.50 kg

[09/11/2023 10:53:13] Received data: US,+000091.50 kg

我的目标是理解为什么使用 jSerialComm 库的 Java 程序仅在该特定设备上遇到数据损坏,而它可以成功地从其他设备检索正常数据。如何修改我的 Java 程序以从该特定设备正确接收数据?

java c# serial-port com-port
1个回答
0
投票

在 Java 中,更改

Port
Baudrate
Parity
Databits
的配置,并将其与 C# 匹配。

Port: COM3
BaudRate: 2400
Parity: EVEN
Databits: 7
Stopbits: 1

更改为

Port: COM5
BaudRate: 9600
Parity: None
Databits: 8
Stopbits: 1
© www.soinside.com 2019 - 2024. All rights reserved.