Узел последовательного порта связи с аппаратным обеспечением с CRC16 - PullRequest
0 голосов
/ 13 декабря 2018

Здравствуйте. Мы работаем над приложением узла для управления оборудованием.

Аппаратное обеспечение используется для оплаты счетов.

Связь с последовательным портом осуществляется через шестнадцатеричный код ..

Но мы не уверены, как рассчитать 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);
    })

Ниже приведены инструкции Таблица данных о транспортном уровне

вот он-лайн документ: https://sensis.ru/files/bv50-ssp-manual.pdf

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Вот простая реализация в C CRC-16 / CMS , указанного в документации:

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.

0 голосов
/ 13 декабря 2018

Вы пробовали следующим образом:

CRC16(stringOrBuffer, [optional] encoding)

Пример:

CRC16('7F8001051D82', 'hex')

Тогда в вашем port.write() вы можете использовать вывод CRC16().

Пример:

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

NPM Ссылка репозитория CRC16

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...