读取/计算通过RS232接收的十六进制

时间:2017-07-24 18:09:01

标签: binary serial-port hex byte bits

我正在使用Docklight Scripting将VBScript放在一起,通过RS232与设备通信。所有命令都以十六进制发送。

当我想从设备读取时,我发送一个32位地址,一个16位读取长度和一个8位校验和。

当我想写入设备时,我发送一个16位数据长度,数据,然后是8位校验和。

在十六进制中,发送到设备的数据如下:

AA0001110200060013F81800104D
AA 00 01 11 02 0006 0013F818 0010 4D

(spaced for ease of reading)

AA000111020006是协议标题,其中:

  • AA是Protocol Byte
  • 00是来源ID
  • 01是Dest ID
  • 11是消息类型
  • 02是Command Byte
  • 0006是长度字节

字符串的其余部分细分如下:

  • 0013F818是32位地址
  • 0010是16位读取长度
  • 4D是8位校验和

如果字符串不正确,或者校验和无效,设备将回复错误字符串。但是,我没有收到错误。设备使用以下十六进制字符串回复:

AA0100120200100001000000000100000000000001000029
AA 01 00 12 02 0010 00010000000001000000000000010000 29

(spaced for ease of reading)

同样,字符串的第一部分(AA00011102)是协议标题的一部分,其中:

  • AA是Protocol Byte
  • 01是来源ID
  • 00是Dest ID
  • 12是消息类型
  • 02是Command Byte

发送到设备的内容与设备回复的内容之间的区别在于长度字节不是协议头的“静态”部分,并且将根据请求进行更改。字符串的其余部分按如下方式细分:

  • 0010是长度字节
  • 00010000000001000000000000010000是数据
  • 29是8位校验和

目标是读取存储在NVM中的计时器。定时器存储在60个4字节NVM字的上半部分中。

指令指定我需要读取每个单词的前两个字节,然后对结果求和。

逐字,说明说:

  
      
  • 读取NVM已用时间计时器。计时器存储在60个4字节字的上半部分中。

  •   
  • 读取计时器每个字的前两个字节。读取这些位置的16位值:

         

    13F800H,13F804H,13808H,并继续到13F8ECH。

  •   
  • 总结结果。将总和乘以409.6秒,然后除以3600,得到小时结果。

  •   

我对位,字节和所有其他事物的了解有点混乱。我需要确认的第一件事是我正确地理解了读取协议。

  • 我假设当我将0010指定为16位读取长度时,转换为指令希望我读取的16位值。

  • 我需要更好理解的第二件事是,当它告诉我读取每个单词的前两个字节时,每个单词的前两个字节究竟是什么构成?

  • 我觉得让我更加困惑的是,说明说定时器存储在4字节字的上半部分(对我来说就好像是上半部分)。

我和我的另一位同事坐了一天试图找出如何使这一切工作,我们的试验没有得到任何一致的结果。

我已经在互联网上找到了可以在使用的上下文中更好地解释这一点的东西。

另一个担心是我用来完成这个项目的技术数据在他们的指令中并不是100%准确,并且他们在整个出版物中有相互矛盾的信息或跳过信息(可能接近1000页)。

我真正感谢的是能够更好地理解十六进制/二进制文件的人,以查看我发布的说明,并就我对所提供说明的解释提供一些反馈,并提供任何信息。

0 个答案:

没有答案