【问题标题】:How get data from glucometers in J2ME using serial port?如何使用串口从 J2ME 中的血糖仪获取数据?
【发布时间】:2013-03-11 10:27:39
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java-me serial-port


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 情况正是所呈现的。我已经阅读了与拥有 Bayer Contour XT 相同的文档。我之前忘记写了,我以循环方式向仪表收到的每条消息发送一个 ACK​​,所以我不限制自己只发送一个 ACK​​,没有结果......
    • 我很确定发送 ACK 字节的方式是正确的。如果有可能,请查看您的 GPRS 调制解调器使用的电压电平,可能它的 Tx 信号使用的电压无法被血糖仪可靠地检测到(很容易用示波器完成 - 请参阅链接文档的第 27 页了解电压范围应该管用)。此外,有一个可用的串行端口嗅探器将非常方便。
    • 也许调用flush()会有所帮助?
    • 感谢大家的贡献!目前我没有直接在 GPRS 调制解调器上使用该软件,而是通过我的 PC 上的模拟器。我已经测试了这个模拟器,它可以正常工作,因为在尝试从血糖仪获取数据之前,我尝试使用我也可以通过 shell 发送的命令查询 GPRS 调制解调器,我没有问题!我已经尝试过使用 FLUSH 方法。使用嗅探器串行端口是个好主意。你知道一些适用于 Windows 的软件(可能是免费的)吗?
    • IMO 纯软件嗅探器对嵌入式工作没有那么有用,所以我不能推荐那里的产品,现在我主要使用Logic 来分析通信。它不是免费的,但它是一个非常通用的很棒的小设备,我只能推荐它。不利的一面是,您需要访问通信的 TTL 端(线路驱动器的“内部”),您不能将其夹在 RS232 链路上。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多