USB-to-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-to-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가 곧 매초 깜박하기 때문에 요청이 전송되고 있음을 안다. 그러나 나는 그 요청에 아무 대답도받지 못한다. 나는 또한 파이썬과 터미널을 통해 데이터를 전송하는 다른 방법을 시도했지만 비슷한 성공을 거뒀습니다. 송신을위한 녹색 램프가 항상 점멸하지만 아무런 반응이 없으며 응답이 수신되지 않습니다. 나는 다음에 무엇을 시도해야 할지를 놓치고 있으며, 당신이 줄 수있는 어떤 도움에 정말로 감사 할 것입니다.
업데이트 : 좋아, 그럼 내가 한 가지 가능한 오류를 발견 한 것 같습니다. 저는 뭔가를 보낼 때 인터페이스에서 빠져 나가는 신호를 캡처하기 위해 오실로 스코프 (oszilloscope)로 작업하고있었습니다. 나는 하나의 ascii 문자로 시작하여 가장 기본적인 신호가 제대로 전달되는지 확인했다. ascii '0'의 경우 전송되는 신호는 10000011001이고 ascii '1'의 경우 10100011001입니다. 따라서이 신호는 2 개의 startbits가있는 것을 제외하고는 거의 예상대로입니다. 일반적으로 나는 단지 1 개의 시작 비트 만있을 것으로 기대합니다. 전송 된 시작 비트의 양을 변경하는 방법이 있습니까?
RS485 양단이 동일한 두 개의 와이어를 송신 즉 차동 쌍 반이중으로서 모두 D + 및 D-을 사용 같이, D- 변화된다는 사실은 센서가 송신되는 전혀 표시하지 어느 한쪽 끝이 D +와 D-를 모두 전송할 때 달라지기 때문입니다. 예 RS485는 반이중이지만 PC와 센서 사이의 프로토콜에는 데이터를 요청하는 PC와 센서가 관련되어있을 것입니다. 양측은 프로토콜을 알고 협조하여 충돌을 방지합니다. 대부분 요청한 형식이 잘못되었거나 체크섬이 잘못되었을 수 있습니다. 체크섬 계산의 유효성을 검사 할 수 있습니까? – barny
가능한 오류 소스를 줄이기 위해 먼저 직렬 터미널 프로그램을 사용하여 연결을 시도합니다. 수동으로 명령 문자열을 보내고 응답이 있는지 확인하십시오. 명령이 모두 ASCII처럼 보이고 \ r으로 끝나는 것처럼 보입니다 (endianness에 대한 걱정이 없습니다, ralf). "0010074002 =? ccc \ r"여기서 ccc는 10 진수의 체크섬이며 LHS는 3 자로 제로 패딩됩니다. 체크섬은 모듈러스 256 (즉, 000-255) 앞에있는 문자의 모든 값을 간단한 십진수로 더한 것입니다. 0010074002 =? 나는 체크섬 106을 만든다. 그래서 완전한 명령은 "0010074002 =? 106 \ r"이어야한다. 예? – barny
계기 설명서에서 예제 요청을 사용하고 있으므로 체크섬이 정확해야합니다. 체크섬이 정확하지 않더라도 적어도 게이지가 오류를 돌려 보내야한다고 생각합니다. 나는 당신이 '0010074002 =? 106 \ r'(요청에있는 데이터의 길이를 잊어 버린 것)과 비슷한 예제를 사용했다. 그래서 리눅스에서 screen을 사용하여 직렬 포트에 연결한다면이 문자열을 보내려면 정확히 무엇을해야할까요? 죄송합니다. 전에 정말로 이런 종류의 일을 한적이 없었습니다. –