Ich versuche, Daten von einem Vakuummeter (vorheriges Modell von https://www.pfeiffer-vacuum.com/en/products/measurement/digiline/gauges/?detailPdoId=13238&request_locale=en_US) mit einem Computer (Linux 16.04) über eine USB-zu-RS485-Schnittstelle zu empfangen und zu senden (der Halbduplex USB485 -STISO von http://www.hjelmslund.dk/). Wenn ich eine Anfrage an das Messgerät unter Verwendung eines spezifischen Protokolls sende, soll es auf die Anfrage antworten und ich sollte es mit der Schnittstelle empfangen können. Ich habe es geschafft, Daten zu senden, aber wann immer ich Daten sende, scheint es, dass nichts zurückkommt. Ich versuche dies mit Node.js zu tun. Der Code, den ich verwendet, so weit ist:USB-zu-RS485 mit Nodejs
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)
});
, die angeblich eine Anfrage an das Messgerät jede Sekunde zu senden, um den Druck zu messen. Ich weiß, dass die Anfrage gesendet wird, da die TxD-Led jede Sekunde kurz blinkt. Aber ich bekomme keine Antwort auf diese Anfrage. Ich habe auch andere Methoden versucht, Daten zu senden (meistens über Python und das Terminal), aber mit ähnlichem Erfolg. Die grüne Lampe zum Senden blinkt immer, aber dann passiert nichts und es wird keine Antwort empfangen. Ich weiß nicht, was ich als nächstes versuchen soll und würde mich über jede Hilfe freuen, die Sie mir geben könnten.
UPDATE: Ok, also scheint ich einen möglichen Fehler in der ganzen Sache gefunden zu haben. Ich habe mit einem Oszilloskop gearbeitet, um das Signal zu erfassen, das aus der Schnittstelle austritt, wenn ich etwas sende. Ich begann mit einzelnen ASCII-Zeichen, um zu sehen, ob die grundlegendsten Signale richtig ausgehen. Für ascii '0' ist das Signal, das gesendet wird, 10000011001, für ascii '1' ist es 10100011001. Also sind das fast, was ich erwarten würde, außer dass es 2 Startbits zu geben scheint. Normalerweise würde ich erwarten, dass es nur 1 Startbit gibt. Gibt es eine Möglichkeit, die Anzahl der gesendeten Startbits zu ändern? Hier sind die Ausgänge der Oszilloskop:
als RS485 nutzt sowohl die D + und D- als Differentialpaar Halbduplex-, dh beide Enden an den gleichen zwei Drähte übertragen, die Tatsache, dass D- ändert absolut kein Hinweis darauf, dass der Sensor überträgt , weil, wenn eines der beiden Enden sowohl D + als auch D- überträgt, variieren wird. Ja RS485 ist Halbduplex, aber das Protokoll zwischen PC und Sensor wird wahrscheinlich PC betreffen, der Daten und Sensoren anfordert und dann abschaltet. Beide Enden kennen das Protokoll und arbeiten zusammen, um Kollisionen zu vermeiden. Höchstwahrscheinlich ist Ihre Anfrage nicht korrekt formatiert oder die Prüfsumme ist falsch. Können Sie die Prüfsummenberechnung überprüfen? – barny
Um mögliche Fehlerquellen zu reduzieren, würde ich zuerst versuchen, eine Verbindung mit einem seriellen Terminalprogramm herzustellen. Senden Sie manuell die Befehlszeichenfolge, um festzustellen, ob eine Antwort vorliegt. Sieht so aus, als wäre ein Befehl alles in ASCII, beendet durch \ r (also keine Sorge um Endianess, Ralf), z.B. "0010074002 =? Ccc \ r" Dabei ist ccc die Prüfsumme in Dezimal, Null-aufgefüllt auf LHS zu drei Zeichen. Die Prüfsumme ist die einfache dezimale Addition aller Werte der Zeichen davor, Modulo 256, d.h. 000-255. Für 0010074002 =? Ich mache die Prüfsumme 106, also sollte der vollständige Befehl "0010074002 =? 106 \ r" sein. Ja? – barny
Die Prüfsumme sollte korrekt sein, da ich eine Beispielanforderung aus der Dokumentation des Messgerätes verwende. Und selbst wenn die Prüfsumme falsch wäre, sollte das Messgerät zumindest einen Fehler zurücksenden. Ich benutzte ein ähnliches Beispiel wie Sie, das wäre "0010074002 =? 106 \ r" (Sie haben die Länge der Daten in der Anfrage vergessen). Also, wenn ich Bildschirm in Linux verwenden würde, um die serielle Schnittstelle zu verbinden, was müsste ich genau tun, um diese Zeichenfolge zu senden? Entschuldigung, ich habe nie wirklich mit so etwas gearbeitet, bevor –