2

我必须为必须与电子医疗设备(血糖仪)接口的可编程 GPRS 调制解调器 JAVA (J2ME)做一个应用程序。

我在设备的串行端口上有一个输入缓冲区和一个输出缓冲区。

当应用程序启动时,我在串口上监听,我从血糖仪收到一个字节,十进制代码“5”对应于 ASCII 表,查询符号,15 秒后我得到字节“4”对应于传输结束。

要从血糖仪接收数据,我需要发送一个对应于字节“6”的 ACK 信号(确认) 。我尝试了以下表格:

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 编码的价值,有人可以指出任何解决方案吗?

4

2 回答 2

1

由于这似乎是一个非常低级的接口,它使用 ASCII 控制字符进行通信,我认为您需要逐字发送这些字节值,而不需要像换行符或其他任何额外的东西。这意味着

byte[] bSend = new byte[] { 6 }; 
outBuffer.write(bSend);

是正确的做法。现在,这个协议看起来很像 ASTM E1381,所以我在这里检查了一下,第 6.1.2 段可能与您的问题有关:

<ENQ>当仪表启动建立阶段时,仪表通过最初发送一个字符来确定计算机是否已连接。如果计算机在 15 秒内通过发送<ACK> 字符做出响应,仪表将进入数据传输模式。如果计算机在 15 秒内以<NAK>字符响应,则仪表会发送一个 然后尝试通过从计算机中<EOT>查找字符来进入远程命令模式 。<ENQ>另请参阅“第 6.2 节远程命令模式协议”。15 秒内对仪表的 <ENQ><ACK>or<NAK>字符以外的任何响应都会导致仪表发送一个<EOT>,延迟一秒,然后再发送一个<ENQ>。如果计算机在 15 秒内没有响应,则仪表发送一个<EOT>,延迟一秒钟,然后发送另一个<ENQ>并再次等待计算机的响应。注意:发送 1 秒后<ENQ>,仪表可能会进入低功耗模式。因此,有可能<ACK>计算机发送的第一个没有被正确读取。在这种情况下,仪表以 响应<EOT>,延迟一秒,然后发送另一个<ENQ>

强调我的,我想这就是正在发生的事情。因此,您应该重复发送另一个 ENQ 以使其进入数据传输模式,假设那是您想要的。

于 2013-03-11T10:50:13.193 回答
0

它应该是字节 bSend=(byte)0x6; outBuffer.write(bSend);

于 2013-05-08T04:49:49.297 回答