用java向串行端口发送一个带有标头和正文的台面



我到处找,都找不到这个问题的答案。我很确定这并不困难,可能是因为我的搜索没有使用正确的措辞。

我正在与万向节控制器进行通信。我已经能够连接到它所连接的串行端口。我找不到关于如何格式化这样的消息的信息:

每个命令包括标头和正文的,两者都带有校验和。标头或正文校验和错误的命令,或正文大小与预期不同,应忽略。

有人能给我指一下如何像那样写入串行端口的方向吗?

谢谢你,

洛伦

通过串行端口与设备通信有两种典型的方法。在这两种情况下,最终结果都是通过导线发送原始位。如果你的设备需要,你可以发送ASCII字符串,但由于你的摘录特别提到了数据包封装,我敢说他们想要字节。

你复制粘贴的摘录听起来像是来自一本手册,该手册解释了通信所需的确切协议。简言之,您将执行以下操作。

  1. 设置串行端口
  2. 准备序列数据
  3. 发送您的串行数据

我喜欢使用jSSC进行串行通信,尽管很多其他人都使用RXTX。jSSC对我来说更可靠,所以这就是我将在示例中使用的。设备手册应规定所需的波特率、数据位、停止位、奇偶校验和握手(如果有)。

在这里,我们设置了一个端口(根据需要替换您的参数)。有关详细信息,请参阅文档。https://github.com/scream3r/java-simple-serial-connector

SerialPort _port = new SerialPort(portName);
_port .openPort();
_port.setParams(baudRate, dataBits, stopBits, parity, setRTS, setDTR);  
_port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);

要构建您的数据包,您需要知道:

  1. 页眉格式
  2. 长度要求/限制
  3. 校验和方法

在这里,我将制作一个超级简单的数据包,它只是一个例子,很可能不适用于您的用例。

// Format is: [length][7 data bytes][8 bit additive checksum]
// Create an empty byte array
byte[] packet = new byte[8];
// Our simple header
packet[0] = packet.length;
// Some data
byte[] dummyData = new byte[] { 1, 2, 3, 4, 5, 6, 7 };
// Copy data to packet
System.arraycopy(dummyData, 0, packet, 0, dummyData.length);
// Go do the checksum (good exercise for you)
byte checksum = getChecksum(packet);
packet[7] = checksum;

所以现在我们有了一个端口,一些数据。。。现在呢?让我们发送。

// Just send those bytes
_port.writeBytes(packet);

一旦掌握了窍门,请了解如何读取响应、设置OnDataReceivedEvents,以及如何更有效地创建数据包。谷歌的一些好条件:

  • jSSC
  • Java RXTX
  • 波特率
  • 异步/同步数据处理

相关内容

最新更新