作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将一个值放入十六进制数组中,以通过套接字通过 modbus/TCP 写入设备。我的问题是,我无法获取类似于 byteArrayWriteTemperature
元素类型的 hex
值。然后我计算 crc
来准备要发送的数组,并且我需要将此 crc
附加到数组的最后两个元素
例如,对于 value = 45
我的数组将是:
array = [0x01, 0x10, 0x04, 0x00, 0x00, 0x01, 0x02, 0x00, 0x2d, 0x23, 0x8d]
使用Crc16()
方法,如果buff = [0x01, 0x10, 0x04, 0x00, 0x00, 0x01, 0x02, 0x00, 0x2d]
其中最后一个元素是 0x2d
(十进制为 45
),我得到 crc swapped = 8d23
而不是 238d
就像数组
的最后2个元素
setTemperature(value: number) {
console.log('about to set temperature value ', value);
let hex = value.toString(16)
const byteArrayWriteTemperature = [0x01, 0x10, 0x04, 0x00, 0x00, 0x01, 0x02, 0x00, hex];
let crc = this.Crc16(byteArrayWriteTemperature, byteArrayWriteTemperature.length)
console.log('crc ', crc)
console.log('array: ', byteArrayWriteTemperature);
this.writeToDevice(byteArrayWriteTemperature)
}
Crc16(buff, length) {
let crc = 0xffff;
for (let pos = 0; pos < length; pos++) {
crc ^= buff[pos]; // (uint8_t) // XOR byte into least sig. byte of crc
for (let i = 8; i != 0; i--) {
// Loop over each bit
if ((crc & 0x0001) != 0) {
// If the LSB is set
crc >>= 1; // Shift right and XOR 0xA001
crc ^= 0xa001;
} else {
crc >>= 1; // Just shift right
} // Else LSB is not set
}
}
return crc;
}
如何正确准备阵列?谢谢
最佳答案
所以,如果我正确理解了这个问题,您希望您的 crc 以小端顺序存储并附加到数组的末尾。
所以你所在的地方:
return crc;
你需要做:
return [crc & 0xFF, (crc & 0xFF00) >> 8];
这将返回一个包含 [0x23, 0x8d] 的数组;假设crc的值为0x8d23
之后的行:
let crc = this.Crc16(byteArrayWriteTemperature, byteArrayWriteTemperature.length);
添加:
byteArrayWriteTemperature = byteArrayWriteTemperature.concat(crc);
将 crc 附加到 byteArrayWriteTemperature 数组的末尾
关于javascript - 如何将值转换为十六进制以在javascript中以数组形式发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59893961/
我是一名优秀的程序员,十分优秀!