2016-07-06 8 views
0

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:

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

+0

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

+0

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

+0

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 –

Antwort

0

dies ist ein Kommunikationsproblem:

Überprüfen der protokollbasierte Kommunikationsparameter wie Baudrate, Parität, Beginn -/stop-bits sie müssen konsistent sein (wenn Sie UART-Protokoll auf RS-485 andere Protokolle wie MODBUS, Profibu verwenden s, ... sind auch möglich, dies ist ein Unterschied zu normalen RS-232)

Wenn das Messgerät 9600 Baud für die Kommunikation verwendet, können Sie nicht 115200 Baud in Ihrem Befehl verwenden. Im Nodejs-Code setzen Sie keinen Parameter (ich nehme an, Sie verwenden das UART-Protokoll wegen Ihrer Nodejs). Wenn das Messgerät ein anderes Protokoll wird der NodeJS Code verwendet auch nicht, trotz dass es keine Parameter wie Baudrate eingestellt werden, Parität, ... im Code https://en.wikipedia.org/wiki/RS-485

für andere Protokolle Knoten js serielle Modul kann nicht

http://libmodbus.org/

http://www.pbmaster.org/

Kontrolle der proprieta verwendet werden ry Befehle senden Sie an das Messgerät. Wenn ich die Daten meines Multimeters auslesen möchte, muss ich ein ASCII 'D' = 0100 0100 (bin) senden, um eine Antwort zu erhalten (endianness?) Wenn ich irgendeinen anderen Wert sende, bleibt das Multimeter ruhig.

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

+0

Also für 1) Wenn ich den neuen Port definieren, lasse ich die Optionen für die Kommunikationsparameter frei, da die Standard-Parameter sind bereits, was ich brauche (Baudraten 9600, keine Parität, 8 Datenbits, 1 Stopbit 2) die Befehle, die ich send sind durch das Pfeiffer-Protokoll definiert, wobei die ersten 3 Bits die Adresse des Messgeräts sind, gefolgt von einem Aktionsindikator (2 Bits), dem Parameter (3 Bits), der Länge der Daten, den Daten und einer Prüfsumme gefolgt von einem Schlitten zurück –

+0

ah okay, das Protokoll ist wirklich UART. Zur besseren Übersicht fügen Sie die UART-Parameter in die Nodejs ein. Es gibt andere UART-Parameter wie * Flusskontrolle *. Überprüfen Sie diese auch und fügen Sie sie ein. Sonst, wenn das alles korrekt ist, liegt es vielleicht an der Endian in den Befehlen? –

+0

* Flow Control * ist spezifisch für RS-232 und ist nicht in RS-485 nach http://www.electronicspoint.com/threads/flow-control-in-rs485.25678/ –