USB-RS485 с использованием Nodejs

Я пытаюсь получать и отправлять данные с вакуумметра (предыдущая модель https://www.pfeiffer-vacuum.com/en/products/measurement/digiline/gauges/?detailPdoId=13238&request_locale=en_US) с помощью компьютера (Linux) 16.04) через интерфейс USB-RS485 (полудуплекс USB485-STISO от http://www.hjelmslund.dk/). Когда я отправляю запрос на датчик, используя определенный протокол, он должен ответить на запрос, и я должен быть в состоянии получить его через интерфейс. Мне удалось отправить данные, но всякий раз, когда я отправляю данные, кажется, что ничего не возвращается. Я пытаюсь сделать это с Node.js. Код, который я использовал до сих пор:

function pack(address, action, parameter, data) {
    var length = String('00' + data.length.toString()).slice(-2);
    var bufferAsString = address + action + parameter + length + data;
    var check = 0;
    for (var i = 0; i < bufferAsString.length; ++i) {
        check += bufferAsString.charCodeAt(i)
    }
    var checkSum = String('000' + String(check % 256)).slice(-3);
    var buffer = Buffer.from(bufferAsString + checkSum),
        carriageReturn = Buffer.from('\r');
    return Buffer.concat([buffer, carriageReturn]);
}

var serialPort = require('serialport');
var SerialPort = serialPort.SerialPort;

var port = new SerialPort('/dev/ttyUSB0', {
    baudrate: 9600,
    dataBits: 8,
    stopBits: 1,
    parity: 'none'
}, false);
port.open(function(err) {
   if (err) {
       return console.log('Error opening port: ', err.message);
   }
    console.log(port.isOpen());
    port.on('data', function (data) {
        console.log('Data: ' + data);
    });
    port.on('close', function() {
        console.log('port closed')
    });
    var sendBuffer = pack('001', '00', '740', '=?');
    setInterval(function() {
        port.write(sendBuffer, function(err, bytes) {
            console.log('send' + bytes)
        });
        port.drain();
    }, 1000)
});

Это должно отправлять запрос каждую секунду к манометру для измерения давления. Я знаю, что запрос отправляется, так как светодиод TxD мигает каждую секунду. Но я не получил ответа на этот запрос. Я также попробовал другие способы отправки данных (в основном через python и терминал), но с таким же успехом. Зеленая лампа для отправки всегда мигает, но тогда ничего не происходит, и ответ не получен. Я не знаю, что делать дальше, и буду очень признателен за любую помощь, которую вы мне сможете оказать.

ОБНОВЛЕНИЕ: Хорошо, таким образом, я, кажется, нашел одну возможную ошибку во всем этом. Я работал с осциллографом для захвата сигнала, который выходит из интерфейса при отправке чего-либо. Я начал с одиночных символов ascii, чтобы проверить правильность основных сигналов. Для ascii '0' отправляемый сигнал равен 10000011001, для ascii '1' это 10100011001. Так что это почти то, что я ожидал, за исключением того, что кажется, что есть 2 стартовых бита. Обычно я ожидаю, что будет только 1 стартовый бит. Есть ли способ изменить количество отправленных стартовых битов? Вот результаты осциллографа:

Сигнал ASCII '0Сигнал ASCII '1

1 ответ

Если у вас не будет DE, а R︦E︦ привязан к земле, ваш разговор будет довольно односторонним.

И если вы используете провод, как указано выше, вам нужно иметь возможность обрабатывать собственное эхо в полученных данных.

Это проблема общения:

1 проверьте параметры связи на основе протоколов, такие как скорость передачи, четность, начальные / стоповые биты, они должны быть согласованными (если вы используете протокол UART на RS-485, возможны и другие протоколы, такие как MODBUS, Profibus,..., это это отличие от обычного RS-232)

Если датчик использует 9600 бод для связи, вы не можете использовать 115200 бод в вашей команде. В коде nodejs вы не устанавливаете никаких параметров (я предполагаю, что вы используете протокол UART из-за ваших nodejs). Если датчик использует любой другой протокол, код nodejs также не будет работать, несмотря на то, что в коде https://en.wikipedia.org/wiki/RS-485 не задано никаких параметров, таких какскорость передачи, четность,...

для других протоколов узла последовательный модуль js не может быть использован

http://libmodbus.org/

http://www.pbmaster.org/

2 проверьте патентованные команды, которые вы отправляете на датчик. Когда я хочу прочитать данные моего мультиметра, я должен отправить ASCII 'D' знак равно 0100 0100 (bin), чтобы получить ответ (порядковый номер?) Если я отправлю любое другое значение, мультиметр будет молчать.

http://electronicdesign.com/what-s-difference-between/what-s-difference-between-rs-232-and-rs-485-serial-interfaces

Другие вопросы по тегам