【问题标题】:How to convert hexadecimal data (stored in a string variable) to an integer value如何将十六进制数据(存储在字符串变量中)转换为整数值
【发布时间】:2019-01-16 14:04:13
【问题描述】:

编辑(摘要)

我试图将 Char/String 数据解释为 Byte,一次 4 个字节。这是因为我只能让TComport/TDatapacket 将流数据解释为字符串,而不是任何其他数据类型。我仍然不知道如何让Read 方法和OnRxBuf 事件处理程序与TComport 一起工作。

问题总结

我正在尝试使用一些 Delphi 代码从质谱仪 (MS) 获取数据。仪器通过串口线连接,遵循 RS232 协议。我能够毫无问题地发送命令并处理来自 MS 的基于文本的输出,但我在解释数据缓冲区时遇到了问题。

背景

来自本仪器的用户手册:

"除离子电流值外,RGA 的输出是 ASCII 字符串,由换行符 + 回车终止符终止。离子信号以 10^-16 安培为单位的整数表示,并直接以十六进制格式(四字节整数,2 的补码格式,最低有效字节在前)以获得最大数据吞吐量。"

我不确定 (1) 十六进制数据是否可以正确存储在字符串变量中。我也不确定如何(2)在 Delphi 中实现 2 的补码和 (3) 首先是最低有效字节。

【问题讨论】:

  • 唯一可以存储十六进制的地方是字符串。那是因为十六进制是数字的文本表示。也许你真正拥有的是二进制数据,即字节数组,这就是你所说的十六进制的意思。
  • 很公平,但我是否正确假设我应该将从 OnPacket 事件中获得的“字符串”转换为字节数组以继续前进?
  • 我真的不知道。我不能理解这个问题。不过,我没有看到任何似乎与十六进制有关的代码。
  • 基本上,我一次从仪器获取 4 个字节的数据,但事件处理程序将其存储在一个字符串中。我想将该字符串转换为整数值,但我得到的字符串是“æ”等。所以我必须弄清楚如何将其转换为字节数组以继续前进。
  • 所以不要读入字符串。请改为调用 Read 方法。 stackoverflow.com/questions/2458219 说真的,我敦促您退后一步,放慢速度,花一些时间真正尝试理解二进制和文本之间的区别,以及十六进制的真正含义。清楚这一点非常重要。

标签: delphi serial-port buffer delphi-5 tcomport


【解决方案1】:

按照@David Heffernan 的建议,我去修改了我的数据类型。尝试从字符中获取二进制数据是行不通的,因为并非 0-255 之间的所有值都可以正确表示。基本上,您会在此过程中丢失数据。特别是您的数据一次表示 4 个字节。

我的解决方案是使用 Async Professional 组件而不是 Denjan 的 Comport 库。它可以更好地处理数据流,并且有一个内置日志,我可以使用它来确定如何解释来自仪器的流式响应。它也有更好的记录。所以,如果你是串行通信的新手(就像我一样),那就试试吧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-30
    • 2015-11-29
    • 2010-11-09
    • 1970-01-01
    • 2014-12-15
    相关资源
    最近更新 更多