我有一个通过COM端口输出的设备。 当我在 COM 解释器(例如 PuTTY)中读取它时,我得到一个漂亮的输出,例如
+0.000E-3
但是,当我尝试通过 C 语言读取它时,我得到了一些我不知道如何解释的二进制文件。 例如,上面的输出结果为
0aa6 b52a0925
。 +1E+9
的另一个输出是0a 6aad2aa5
。 我不知道如何解释两者之间的任何内容,因为我无法获得足够稳定的输出来 100% 确定这就是它的含义。 例如,0a6a09 d4a669a5
是 +9.303E+0
或 +9.304E+0
。 此外,+0.0139E-3
可能映射到 0aa6b52a 534c0925
或 0aa6b52a a64c0925
或 0aa6b52a 264c0925
。 我什至不明白为什么有些输出是5字节,有些是6字节,有些是7字节,有些是8字节,有些甚至是9字节。 但当输出较长时,输出往往会向左移动。 换句话说,如果
0aa6 b52a8925 is +0.000E-3, then
0a6a69 54a60925 and
0aa6 b52a094b and
0a6a69 54a6094b and
0aa6 b52a2925
是接近它的值——可能分别是
-0.000E-3
、+0.001E-3
、-0.001E-3
和其他值。
如何将 COM 端口的二进制输出转换为像 PuTTY 输出这样的好东西? 或者,是否有一个适用于 Windows 10 的实用程序,我可以在其中在二进制视图和格式化视图之间切换,以便我可以尝试查找所使用的模式?
我正在使用标准设置:
Parity: none (parity bit 0)
Number of data bits: 8 (7 data + 1 parity bit)
Number of stop bits: 1
编辑:我找到了另一个可靠的读物:
+0.015E-3
——但是,它的二进制输出也是0aa6 b52a0925
,与+0.000E-3
相同。 所以,这里还发生了一些我不知道的事情。
----我的分析----
因为倒数第二个字节的第一位变化很大,我猜它可能是一个校验位。 基于 7 数据位设置,这会将“每个”字节的第一位放置为校验位。 换句话说,我必须去掉每个字节的最高有效位。 在这种情况下,0a 6aad2aa5
经历了以下过程:
0000 1010 0110 1010 1010 1101 0010 1010 1010 0101
x000 1010 x110 1010 x010 1101 x010 1010 x010 0101
000 1010 1101 0100 1011 0101 0101 0010 0101
ad 4b 55 25
如果没有看到附近的东西,仍然很难弄清楚这怎么会变成
+1E+9
。 同样,
0aa6 b52a0925
经历以下过程:0000 1010 1010 0110 1011 0101 0010 1010 0000 0101 0010 0101
x000 1010 x010 0110 x011 0101 x010 1010 x000 0101 x010 0101
此时,我意识到这两个字节中的最后一个字节(校验位除外)是相同的:
010 0101
。 但在第二种情况下,检查位是 0,而在第一种情况下,检查位是 1。很明显我做错了什么。
我也尝试了相反的方法。 我知道9
是二进制的
1001
。 因此,如果我知道该值是 +1E+9
,那么我会在二进制文件中查找 1001
,并尝试理解其余部分的含义;但这并没有产生有用的结果。 我想,也许字节是小端字节序? 也许这些位的顺序相反? 但我还是想不通。我无法在网上找到 COM 通信标准来帮助我解决这个问题。
Byte size = 8
设置意味着,有8个数据位和1个奇偶校验位;另一方面,在我的机器上,
Number of data bits: 8
明确表示为7 data + 1 parity bit
。 结果,一些数据位被计为校验位,并且校验位被计为数据位。 所以我将代码更改为 Byte size = 7
,此时输出开始看起来更加熟悉。 事实证明,Mark Ransom 所说的是正确的,只是在末尾添加了0D 0A
。