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 стартовый бит. Есть ли способ изменить количество отправленных стартовых битов? Вот результаты осциллографа:
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 не может быть использован
2 проверьте патентованные команды, которые вы отправляете на датчик. Когда я хочу прочитать данные моего мультиметра, я должен отправить ASCII 'D'
знак равно 0100 0100
(bin), чтобы получить ответ (порядковый номер?) Если я отправлю любое другое значение, мультиметр будет молчать.