计算 3964r 串行通信协议的 BCC
Calculating the BCC for the 3964r serial communications protocol
我正在尝试编写一些代码,通过使用 Siemens 3964r 协议的串口与旧设备进行通信。这包括校验和,或更准确地说是传输结束时的 BCC(块校验字符)。 ETX 之后的单个字符。文档将 BCC 定义为:
使用 3964R 传输协议,通过发送额外的块来增强数据安全性
检查字符(BCC = 块检查字符)。
块校验字符为偶数纵向奇偶校验(所有数据的EXOR逻辑运算
字节)发送或接收块。它的计算从用户数据的第一个字节开始(第一个
帧的字节)在连接建立之后,并在 DLE ETX 字符之后结束
在连接终止时。
这是一些十六进制的示例数据。
53 54 41 54 55 53 10 03 07
07 是这一篇的密件抄送。
4d 45 41 53 4d 50 54 45 53 54 41 4e 41 50 52 47 30 30 30 55 78 30 31 31 2e 30 30 5a 30 31 31 31 30 10 03 61
61 是这一篇的密件抄送。
我大体上知道如何进行 XOR 运算,但我一直无法找出可以给我正确密件抄送的任何组合。我想我对定义的解释是错误的。
我的首选语言是 javascript,因为它是 node.js 电子应用程序。我可以读取缓冲区并获取十六进制值。而且我可以构造支持者消息。但它不会正常工作,直到我可以包括一个适当的密件抄送。因此,只需寻找比我更聪明、确切知道如何生成有效密件抄送的人。
谢谢!
作为第一条评论发布的文档具有计算 3964r BCC 的正确结构。该文件在这里:
这是一个简单的 javascript 函数。 hexarray 将被传入,而不是像这里那样硬编码,但这可以准确地计算这个特定协议的 BCC。如果有人关心或需要它。我只是在此处将 bcc 作为十六进制字符串写到控制台,但您可以将其设为一个函数,实际上 return 一些可用的东西。
var hexarr = ['4d', 45, 41, 53, '4d', 50, 30, 30, 10, 03];
var bcc = 0;
var xor = 0;
for(var i= 0; i< hexarr.length; i++){
var hexint = parseInt(hexarr[i],16);
if(i==0){ xor = hexint; }
else {
bcc = xor ^ hexint;
xor = bcc;
}
}
console.log(bcc.toString(16));
我正在尝试编写一些代码,通过使用 Siemens 3964r 协议的串口与旧设备进行通信。这包括校验和,或更准确地说是传输结束时的 BCC(块校验字符)。 ETX 之后的单个字符。文档将 BCC 定义为:
使用 3964R 传输协议,通过发送额外的块来增强数据安全性 检查字符(BCC = 块检查字符)。 块校验字符为偶数纵向奇偶校验(所有数据的EXOR逻辑运算 字节)发送或接收块。它的计算从用户数据的第一个字节开始(第一个 帧的字节)在连接建立之后,并在 DLE ETX 字符之后结束 在连接终止时。
这是一些十六进制的示例数据。 53 54 41 54 55 53 10 03 07
07 是这一篇的密件抄送。
4d 45 41 53 4d 50 54 45 53 54 41 4e 41 50 52 47 30 30 30 55 78 30 31 31 2e 30 30 5a 30 31 31 31 30 10 03 61
61 是这一篇的密件抄送。
我大体上知道如何进行 XOR 运算,但我一直无法找出可以给我正确密件抄送的任何组合。我想我对定义的解释是错误的。
我的首选语言是 javascript,因为它是 node.js 电子应用程序。我可以读取缓冲区并获取十六进制值。而且我可以构造支持者消息。但它不会正常工作,直到我可以包括一个适当的密件抄送。因此,只需寻找比我更聪明、确切知道如何生成有效密件抄送的人。
谢谢!
作为第一条评论发布的文档具有计算 3964r BCC 的正确结构。该文件在这里:
这是一个简单的 javascript 函数。 hexarray 将被传入,而不是像这里那样硬编码,但这可以准确地计算这个特定协议的 BCC。如果有人关心或需要它。我只是在此处将 bcc 作为十六进制字符串写到控制台,但您可以将其设为一个函数,实际上 return 一些可用的东西。
var hexarr = ['4d', 45, 41, 53, '4d', 50, 30, 30, 10, 03];
var bcc = 0;
var xor = 0;
for(var i= 0; i< hexarr.length; i++){
var hexint = parseInt(hexarr[i],16);
if(i==0){ xor = hexint; }
else {
bcc = xor ^ hexint;
xor = bcc;
}
}
console.log(bcc.toString(16));