簡體   English   中英

使用 Nodejs 的 USB 轉 RS485

[英]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 的輸出:

ASCII '0' 信號ASCII '1' 信號

這是一個溝通問題:

1檢查基於協議的通信參數,如波特率、奇偶校驗、起始/停止位,它們必須保持一致(如果您在 RS-485 上使用 UART 協議,其他協議如 MODBUS、Profibus... 也是可能的,這與普通 RS-232 不同)

如果儀表使用 9600 波特進行通信,則不能在命令中使用 115200 波特。 在 nodejs 代碼中,您沒有設置任何參數(我假設您因為 nodejs 而使用 UART 協議)。 如果儀表使用任何其他協議,nodejs 代碼也將無法工作,盡管在代碼https://en.wikipedia.org/wiki/RS-485中沒有設置任何參數,如波特率、奇偶校驗等

對於其他協議 node 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

除非您將 DE 拉高並將R︦E︦ 接地,否則您的談話將是片面的。

如果你按照上面的方式進行連線,你需要能夠在接收到的數據中處理你自己的回聲。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM