我必须申请GPRS调制解调器JAVA (J2ME)可编程,必须与电子医疗设备(血糖仪)接口。
我在设备的串口上有一个输入缓冲区和一个输出缓冲区。
当应用程序启动时,我在串口上收听,我从血糖仪收到一个带十进制代码“5”的字节,对应于ASCII表,查询符号,15秒后我得到字节“ 4“对应于传输结束。
要从血糖仪接收数据,我需要发送一个ACK信号(确认),它对应于字节“6”。 我尝试了以下形式:
outBuffer.write("ACK\r\n".getBytes()); //first without setting the charset and after I trying to set all the charset.
我试图像这样发送一个字节缓冲区:
byte[] bSend = new byte[] { 6 };
outBuffer.write(bSend); //(I tried also with the byte 10 (LF) and 13 (CR)).
结果是我无法接收数据,但我得到周期性但只有值5和4。
如果发送ACK消息,所有可以与串口(如串行监视器)通信的软件我都能正确地从血糖仪接收数据。
我认为我的问题是由于Java中的ACK编码的价值,有人可以指出任何解决方案吗?
答案 0 :(得分:1)
由于这似乎是一个使用ASCII控制字符进行通信的相当低级别的接口,我认为你需要逐字发送这些字节值,而不需要像换行符或其他任何东西。这意味着
byte[] bSend = new byte[] { 6 };
outBuffer.write(bSend);
是正确的方法吗?现在,这个协议看起来很像ASTM E1381,所以我查了here,第6.1.2段可能与你的问题有关:
当仪表启动建立阶段时,仪表确定 如果通过最初发送
<ENQ>
字符来连接计算机。 如果计算机通过发送<ACK>
在15秒内响应 字符,仪表进入数据传输模式。如果是电脑 使用<NAK>
字符在15秒内响应,仪表发送一个<EOT>
然后通过查找来尝试进入远程命令模式 来自计算机的<ENQ>
字符。另请参见“6.2节远程 命令模式协议“。在15秒内对仪表的任何响应 除了<ENQ>
或<ACK>
字符之外的<NAK>
会导致电表发送<EOT>
,延迟一秒,然后发送另一个<ENQ>
。如果是电脑 在15秒内没有响应,然后仪表发送<EOT>
, 延迟一秒,然后发送另一个<ENQ>
并再次等待 来自电脑的回应。 注意:发送<ENQ>
后一秒钟, 仪表可以进入低功率模式。因此,有可能 计算机发送的第一个<ACK>
未正确读取。在 在这种情况下,仪表以<EOT>
响应,延迟一秒,然后 发送另一个<ENQ>
。
强调我的,我想这就是发生的事情。因此,您应该重复发送另一个ENQ以使其进入数据传输模式,假设这就是您想要的。
答案 1 :(得分:0)