我有一个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 中,更改
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