[英]USB-to-RS485 using Nodejs
我正在嘗試使用計算機(Linux)從真空計( https://www.pfeiffer-vacuum.com/en/products/measurement/digiline/gauges/?detailPdoId=13238&request_locale=en_US )接收和發送數據16.04) 通過 USB 到 RS485 接口(來自http://www.hjelmslund.dk/的半雙工 USB485-STISO)。 當我使用特定協議向儀表發送請求時,它應該響應該請求,並且我應該能夠通過接口接收它。 我設法發送數據,但每當我發送數據時,似乎什么都沒有回來。 我正在嘗試使用 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-Led 每秒閃爍一次。 但我沒有收到對該請求的答復。 我還嘗試了其他發送數據的方法(主要是通過 python 和終端),但取得了類似的成功。 用於發送的綠燈總是閃爍,但隨后什么也沒有發生,也沒有收到答復。 我不知道接下來要嘗試什么,非常感謝您能給我的任何幫助。
更新:好的,所以我似乎在整件事中發現了一個可能的錯誤。 當我發送一些東西時,我正在使用示波器來捕獲從接口傳出的信號。 我從單個 ascii 字符開始,看看最基本的信號是否正確。 對於 ascii '0',發送的信號是 10000011001,對於 ascii '1',它是 10100011001。所以這些幾乎是我所期望的,除了似乎有 2 個起始位。 通常我希望只有 1 個 startbit。 有沒有辦法改變發送的起始位的數量? 以下是 Oszilloscope 的輸出:
這是一個溝通問題:
1檢查基於協議的通信參數,如波特率、奇偶校驗、起始/停止位,它們必須保持一致(如果您在 RS-485 上使用 UART 協議,其他協議如 MODBUS、Profibus... 也是可能的,這與普通 RS-232 不同)
如果儀表使用 9600 波特進行通信,則不能在命令中使用 115200 波特。 在 nodejs 代碼中,您沒有設置任何參數(我假設您因為 nodejs 而使用 UART 協議)。 如果儀表使用任何其他協議,nodejs 代碼也將無法工作,盡管在代碼https://en.wikipedia.org/wiki/RS-485中沒有設置任何參數,如波特率、奇偶校驗等
對於其他協議 node js 串口模塊不能使用
2檢查您發送到儀表的專有命令。 當我想讀出萬用表的數據時,我必須發送一個 ASCII 'D'
= 0100 0100
(bin) 以獲得答案(字節序?)如果我發送任何其他值,萬用表將保持靜音。
除非您將 DE 拉高並將R︦E︦ 接地,否則您的談話將是片面的。
如果你按照上面的方式進行連線,你需要能夠在接收到的數據中處理你自己的回聲。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.