如何使用 Java 读取原始串行数据?

How to read raw serial data using Java?

我目前正在使用 SAS602 实施老虎机会计系统以与老虎机交互。该协议使用非标准 9 位协议进行串行通信。所以数据是 1 个起始位 + 8 个数据位 + 1 个停止位 + 1 个唤醒位(在我的例子中是奇偶校验位)

老虎机根据唤醒位识别地址字节和数据字节。如果它被设置那么字节是地址并且被清除那么它是数据字节。

协议中也提到不支持 9 位,建议使用 Mark/space 奇偶校验。我在 Java 和 jserialcom 上,并设法与老虎机建立连接并读取数据。但是我无法区分数据和地址字节,因为使用 jserialcomm 库 readbytes 会剥离原始数据并仅向我提供数据字节。 我无权访问奇偶校验位状态。

是否可以使用 Java 获取原始 11 位数据?有可能吗?如果是这样,我该怎么做?

我正在打开任何图书馆或 Linux 平台。

由于第9位不是数据而是携带控制信息,配置串口时可以开启奇偶校验。现在,当接收到数据时,计算接收到的字节中 1 的个数,并检查是否发生奇偶校验错误。如果它没有发生并且你知道 1 的数量,你可以很容易地推断出奇偶校验位是 1 或 0,因此是数据或控制。

另请查看this article串口中的第 9 位。

我最后修改了 Jserialcomm 库,在接收数据时忽略奇偶校验,并在传输数据时设置奇偶校验位。接收数据的错误检查完全基于 CRC。到目前为止效果很好。

虽然上述可以通过设置接收数据NO_PARITY来实现。 MARK 和 SPACE 发送字节时的奇偶校验。在使用 Jserialcomm 库切换奇偶校验时,因为设置奇偶校验时有 200ms 的延迟。这再次导致数据丢失。我不完全确定为什么会有这样的延迟。

Linux 中还有一个选项,当奇偶校验后出现错误时,将 255 0 添加到接收到的每个字节。这可以应用于反转奇偶校验机制。但是这种方法也容易出错,因为添加额外的字节需要时间,而且您最终可能会丢失大量数据。这也需要修改Jserialcomm库。