节点与CRC16硬件的串行端口通信

时间:2018-12-13 10:23:22

标签: node.js crc16 node-serialport

您好,我们正在研究节点应用程序以控制硬件。

硬件是票据回收。

通过十六进制代码..

完成与串行端口的通信。

但是我们不确定如何计算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);
    })

以下是说明 Transport Layer Datasheet

这是在线文档:https://sensis.ru/files/bv50-ssp-manual.pdf

2 个答案:

答案 0 :(得分:0)

您尝试了以下操作:

CRC16(stringOrBuffer, [optional] encoding)

示例:

CRC16('7F8001051D82', 'hex')

然后在您的port.write()中,可以使用CRC16()的输出。

示例:

data_to_send = CRC16('7F8001051D82', 'hex')
port.write(data_to_send)

NPM Repository link of CRC16

答案 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馈入。