我目前正在实施Slot会计系统,以便使用SAS602与老虎机进行交互。该协议使用非标准9位协议进行串行通信。所以数据是 1个起始位+ 8个数据位+ 1个停止位+ 1个唤醒位(在我的情况下为奇偶校验位)
老虎机根据唤醒位识别地址字节和数据字节。如果设置则该字节为地址并清除,则为数据字节。
在协议中还提到了9位支持不可用,建议使用标记/空间奇偶校验。我使用jserialcom在Java上,并设法与老虎机建立连接并读取数据。但是我无法区分数据和地址字节,因为jserialcomm库readbytes剥离原始数据并仅提供数据字节。 我无法访问奇偶校验位状态。
是否可以使用Java获取原始的11位数据?它甚至可能吗?如果是这样我该如何去做呢?
我打开任何库或Linux平台。
答案 0 :(得分:1)
因为第9位不是数据而是携带控制信息,所以在配置串口时可以启用奇偶校验。现在,当接收到数据时,计算接收字节中的1到1的数量,并检查是否发生了奇偶校验错误。如果它没有发生并且您知道1的数量,您可以很容易地推断出奇偶校验位是1或0,因此数据或控制。
另请查看串行端口中第9位的this article。
答案 1 :(得分:0)
我最后修改了Jserialcomm库,以便在接收数据时忽略奇偶校验,并在传输数据时设置奇偶校验位。对接收数据的错误检查仅基于CRC。到目前为止,此工作正常。
虽然可以通过在接收的数据上设置NO_PARITY来实现上述目的。发送字节时标记和空格奇偶校验。当使用Jserialcomm库切换奇偶校验时,因为设置奇偶校验时有200ms的延迟。这再次导致数据丢失。我不完全确定为什么会有这样的延迟。
在奇偶校验检查发生错误时,Linux中还有一个选项可以为每个接收的字节添加255 0。这可以应用于逆转奇偶校验机制。但是这种方法也容易出错,因为添加额外的字节需要花费时间,最终可能会丢失大量数据。这也需要修改Jserialcomm库。