2016-07-06 110 views
0

我试图通过USB至RS485接口(半双工USB485)与计算机(Linux 16.04)从真空计(前一型号https://www.pfeiffer-vacuum.com/en/products/measurement/digiline/gauges/?detailPdoId=13238&request_locale=en_US)接收和发送数据-STISO从http://www.hjelmslund.dk/)。当我使用特定的协议向仪表发送请求时,它应该回答请求,我应该能够通过接口接收它。我设法发送数据,但每当我发送数据时,似乎什么都没有回来。我试图用Node.js来做到这一点。我迄今使用的代码是:使用Nodejs的USB至RS485

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和终端),但也取得了相似的成功。发送的绿灯始终闪烁但没有任何反应,也没有收到应答。 我很遗憾接下来要尝试什么,并且非常感谢您可以给我提供的任何帮助。

更新: 好吧,所以我似乎在整个事情中发现了一个可能的错误。我正在使用oszilloscope来捕捉当我发送内容时出现在界面上的信号。我从单一的ASCII字符开始,看看最基本的信号是否合适。对于ascii'0',发送的信号是10000011001,ascii'1'是10100011001.所以这些差不多是我所期望的,除了似乎有2个起始位。通常我会期望只有1个startbit。有没有办法改变发送的startbits数量? 下面是Oszilloscope的输出:

Signal of ASCII '0' Signal of ASCII '1'

+0

正如RS485同时使用d +和D-作为差分对半双工的,即两端部上的相同的两条线上发送,但事实上,D-正在改变是绝对没有迹象表明该传感器发送,因为当任一端传输D +和D-时都会有所不同。是RS485是半双工的,但PC和传感器之间的协议可能会涉及PC请求数据和传感器响应然后关闭。双方都知道协议并合作以确保不会发生冲突。很可能您的请求格式不正确或校验和错误。你能验证校验和计算吗? – barny

+0

为了减少可能的错误来源,我会首先尝试使用串行终端程序进行连接。手动发送命令字符串,看看是否有回应。看起来像一个命令全部是ASCII格式,由\ r结尾(所以不用担心排序,ralf)例如“0010074002 =?ccc \ r”其中ccc是十进制的校验和,在LHS上以零填充为三个字符。校验和是它之前的所有字符值的简单十进制加法,以256为模,即000-255。对于0010074002 =?我做校验和106,所以完整的命令应该是“0010074002 =?106 \ r”。是? – barny

+0

校验和应该是正确的,因为我使用了量表文档中的示例请求。即使校验和不正确,我相信仪表至少应该发回一个错误。我用了一个和你一样的'0010074002 =?106 \ r'(你忘记了请求中数据的长度)。因此,如果我将使用Linux中的屏幕连接到串行端口,那么发送此字符串到底需要做什么?对不起,我从来没有真正与这种事情合作 –

回答

0

这是一个通信问题:

检查基于协议的通信参数等波特率,奇偶校验,开始 - /停止位它们必须是一致的 (如果您在RS-485其他协议上使用UART协议,如MODBUS,Profibu s,...也可能是,这与正常的RS-232不同)

如果仪表使用9600波特通讯,则不能在命令中使用115200波特。在nodejs代码中,你不设置任何参数(我假设你使用UART协议,因为你的nodejs)。如果压力表使用任何其它协议的代码的NodeJS也不会工作,尽管存在未设置任何参数,如波特率,奇偶校验,在各代码 https://en.wikipedia.org/wiki/RS-485

其他协议节点JS串行模块不能使用

http://libmodbus.org/

http://www.pbmaster.org/

检查proprieta ry命令您发送到仪表。当我想读出万用表的数据时,我必须发送一个ASCII 'D' = 0100 0100(bin)以获得答案(字节顺序?)如果我发送任何其他值,万用表将保持沉默。

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

+0

因此,对于1) 当我定义新的端口时,由于标准参数已经是我所需要的(波特率9600,无奇偶校验,8位数据位,1停止位2),我留下了用于通信参数的选项发送由Pfeiffer协议定义,其中前3位是量表的地址,后面跟着一个动作指示符(2位),参数(3位),数据长度,数据和校验和,后面跟着一个滑架返回 –

+0

啊好吧,协议真的是UART。为了清楚起见,在UART中插入UART参数。还有其他的UART参数,如* flow control *。检查这些也插入它们。否则,如果这是完全正确的,也许是因为命令中的字节顺序? –

+0

*流量控制*专用于RS-232,不在RS-485中,根据http://www.electronicspoint.com/threads/flow-control-in-rs485.25678/ –