Java串口通信,接收器上的输入字节错误

3

当我使用Java向接收器发送字节时,一些接收到的字节值会混乱地变成0x3F。(始终将0x0更改为0x3F)

Java源代码:

serialPort = new SerialPort(portName);                       
  serialPort.openPort();
  serialPort.setParams(
    SerialPort.BAUDRATE_9600,
    SerialPort.DATABITS_8,
    SerialPort.STOPBITS_1,
    SerialPort.PARITY_NONE
  );
  serialPort.writeBytes(new byte[]{0,3,(byte)240,1,(byte)242});

当我使用Arduino进行数据传输时,一切运作正常。

Arduino源代码:

byte b[5]={0,3,240,1,242};
void setup() { Serial.begin(9600);}
void loop() {
  for(int i=0;i<5;i++){
    Serial.write(b[i]);
      delay(5);
  }
  delay(1000);
}

当我从java向arduino发送数据时,所有字节看起来都很好。当我使用VB或C#向接收器发送数据时,一切正常。但是,使用Thread.sleep(5)逐个字节地发送数据却没有成功。我做错了什么?我正在使用rxtx || jssc。目前的解决方法是通过arduino将数据发送到接收器。但它很慢且奇怪。
更新: 在监视端口活动后,成功包含几个WAIT_ON_MASK函数(up,down),然后在一个函数IRP_MJ_READ中获得所有正确字节的数据包。 当我尝试使用我的java代码发送数据时,有很多SERIAL_GET_COMMSTATUS(上下)函数,然后是将前3个字节转换为0x3F的IRP_MJ_READ,然后再次是WAIT_ON_MASK & COMMSTATUS,然后是剩余数据逐个字节。 P.s. 接收器是一辆旧的汽车。

在ASCII中,0x3F代表?。这通常表示字符编码问题,但由于你处理的是二进制数据,所以不应该是个问题。它可能仍然与某种相关联。 - Kayaman
这正是我在评论中所说的。然而,如果你一直得到字节转换为 0x3F(即 ASCII ?),我很难相信这只是巧合。 - Kayaman
你是在尝试通过KW1281协议进行通信吗? - Martin Frank
1
不,该协议比ibus(宝马)简单得多。 - Igor Bloom
1
那么你为什么要使用 Thread.sleep() 呢?为什么要故意浪费时间,尤其是当它会导致错误呢? - user207421
显示剩余2条评论
2个回答

0

使用 jserialComm.jar 文件和 arduino.jar 文件直接与串行监视器进行通信(通过谷歌搜索或从链接https://youtu.be/GLX21Bf2kXI直接下载)

第一步:上传 Arduino 代码

第二步:下载 2 个 jar 文件 1. jSerialComm 2. arduino

第三步:将这两个 jar 文件添加到您的项目中并导入 arduino.* 例如:import arduino.*;

第四步:通过编写以下代码创建 arduino 的新对象 Arduino aa=new Arduino();

第五步:使用 setPortDescription() 方法将端口初始化为 arduino 对象,并传递特定端口的字符串 例如:aa.setPortDescription("COM4"); "/dev/tty.usbserial-A9007UX1", // Mac OS X "/dev/ttyACM0", // Raspberry Pi "/dev/ttyUSB0", // Linux "COM3"or"COM4" // Windows

步骤6:使用openConnection()方法打开通信连接。 例如:aa.openConnection();

步骤7:使用serialWrite(String)方法编写或发送命令。 例如:aa.serialWrite("1"); //您也可以使用扫描器功能

步骤8:使用serialRead()方法从串行读取命令。 例如:aa.serialWrite(); 这将返回一个字符串

步骤9:使用closeConnection()方法关闭连接。 例如:aa.closeConnection();


它如何能帮助我? - Igor Bloom
你可以直接向Arduino发送字符串。 - Harsh.jaiswal
我没有向Arduino发送任何内容。我根本不使用Arduino。我也没有发送“字符串”。我的问题是 - 如何在Java中发送字节而不带符号(0-255)。 Arduino仅用于监视字节流。 - Igor Bloom

0
在我的情况下,使用 jssc 的 SerialPort.PARITY_EVEN 解决了这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接