您好,我们正在研究节点应用程序以控制硬件。
硬件是票据回收。
通过十六进制代码..
完成与串行端口的通信。但是我们不确定如何计算CRC16,然后通过串行端口发送数据。
const SerialPort = require('serialport');
var CRC16 = require('crc16');
const path = "/dev/ttyS0";
var port = new SerialPort(path,
{
autoOpen: false,
Timeout:1000,
EncryptionStatus: 0,
BaudRate:9600,
RetryLevel : 3 ,
SSPAddress : 0,
PortNumber : 0,
CommandDataLength : 1,
}, function (err) {
if (err) {
return console.log('Error: ', err.message);
}
});
port.open(function (err) {
if (err) {
return console.log('Error opening port: ', err.message);
}} );
port.on("open", function (err) {
if(err) console.log(err);
port.on('data', function (data) {
console.log('Data: on data : ', data);
console.log("from data ", data.toString('hex'));
let json = JSON.stringify(data);
console.log(json);
});
write_data = Buffer.from('7F80010A3F82','hex');
port.write(Buffer.from('7F8001051D82','hex'), function(err) { console.log('message written')});
});
port.on('close', function() { console.log(' DISCONNECTED ') });
port.on('error', function(err) {
console.log('Error: ', err.message);
})
答案 0 :(得分:0)
您尝试了以下操作:
CRC16(stringOrBuffer, [optional] encoding)
示例:
CRC16('7F8001051D82', 'hex')
然后在您的port.write()
中,可以使用CRC16()
的输出。
示例:
data_to_send = CRC16('7F8001051D82', 'hex')
port.write(data_to_send)
答案 1 :(得分:0)
这是文档中指定的CRC-16/CMS在C中的简单实现:
unsigned crc16cms(unsigned crc, void const *mem, size_t len) {
unsigned char const *data = mem;
if (data == NULL)
return 0xffff;
while (len--) {
crc ^= (unsigned)(*data++) << 8;
for (unsigned k = 0; k < 8; k++)
crc = crc & 0x8000 ? (crc << 1) ^ 0x8005 : crc << 1;
}
crc &= 0xffff;
return crc;
}
用mem == NULL
调用时,它将返回初始CRC。可以使用一系列输入缓冲区顺序调用该例程,以计算其级联的CRC,从等于初始CRC的crc
开始,并将每个结果CRC作为下一个输入crc
馈入。