我试图通过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的输出:
正如RS485同时使用d +和D-作为差分对半双工的,即两端部上的相同的两条线上发送,但事实上,D-正在改变是绝对没有迹象表明该传感器发送,因为当任一端传输D +和D-时都会有所不同。是RS485是半双工的,但PC和传感器之间的协议可能会涉及PC请求数据和传感器响应然后关闭。双方都知道协议并合作以确保不会发生冲突。很可能您的请求格式不正确或校验和错误。你能验证校验和计算吗? – barny
为了减少可能的错误来源,我会首先尝试使用串行终端程序进行连接。手动发送命令字符串,看看是否有回应。看起来像一个命令全部是ASCII格式,由\ r结尾(所以不用担心排序,ralf)例如“0010074002 =?ccc \ r”其中ccc是十进制的校验和,在LHS上以零填充为三个字符。校验和是它之前的所有字符值的简单十进制加法,以256为模,即000-255。对于0010074002 =?我做校验和106,所以完整的命令应该是“0010074002 =?106 \ r”。是? – barny
校验和应该是正确的,因为我使用了量表文档中的示例请求。即使校验和不正确,我相信仪表至少应该发回一个错误。我用了一个和你一样的'0010074002 =?106 \ r'(你忘记了请求中数据的长度)。因此,如果我将使用Linux中的屏幕连接到串行端口,那么发送此字符串到底需要做什么?对不起,我从来没有真正与这种事情合作 –