NEWS
[gelöst] Anbindung CONRAD Transponder RF-Leser über serialport
-
Hallo zusammen,
ich versuche ein C-Programm, das ich mal für die Homematic CCU geschrieben habe, auf iobroker javascript zu portieren.
Das Programm öffnet den serial port /dev/ttyUSB0 an den das Transponder Lesegerät angeschlossen ist.
Das C-Programm lässt sich auch direkt unter Raspbian compilieren und funktioniert einwandfrei. Der Leser reagiert auf den "hello" Befehl und wenn Transponder Token in den Lesebereich kommen, zeigt mein Programm diese an. So öffne ich den Serialport im C-Programm:
int openSerial(const char *SerialDev) { int sfd; if ((sfd = open(SerialDev, O_RDWR | O_NOCTTY)) >= 0) { struct termios newtio; tcgetattr(sfd,&newtio); newtio.c_cflag = B57600 | CS8 | CLOCAL | CREAD; newtio.c_iflag = IXON | IXOFF; newtio.c_oflag = 0; newtio.c_lflag = 0; newtio.c_cc[VMIN] = 0; newtio.c_cc[VTIME] = 10; tcsetattr(sfd,TCSANOW,&newtio); printf("%s geöffnet.\n", SerialDev); // Flush Input/Output tcflush(sfd,TCIOFLUSH); // Hello senden writeSerial(sfd, "\002FFHD4\004"); // Als Antwort kommt die Bezeichnung und Versionsnummer des LeserPlus char *eventdata = readSerial(sfd, 10); if (eventdata != NULL) { printf("LeserPlus gefunden: %s\n", eventdata); } } else { printf("%s kann nicht geöffnet werden.\n", SerialDev); } return(sfd); }
Auf derselben Hardware läuft iobroker inkl. javascript Adapter. "serialport" ist in den Einstellungen eingetragen und wurde beim ersten Start compiliert und installiert. Ich kann /dev/ttypUSB0 fehlerfrei öffnen und in seltenen Fällen liest er auch Daten vom Serialport. Trotz aller Versuche, finde ich den Fehler nicht.
Hat jemand einen Tipp, was ich noch versuchen könnte? Wenn ich das C-Programm starte, lese ich die Daten wieder sofort.
Der folgende Code sollte wenigstens ein paar Bytes ausgeben, wenn ein Transponder gelesen wird. Mit oder ohne platformOptions macht keinen Unterschied:
var SerialPort = require("serialport"); var port = new SerialPort("/dev/ttyUSB0", { baudRate: 57600, xon: true, xoff: true, //flowControl: false //parser: SerialPort.parsers.byteDelimiter([2,4]) platformOptions: {vmin: 0, vtime: 10, hupcl: false} }, function (err) { if (err) { return console.log('Error: ', err.message); } // Flush input port.flush(); // send hello port.write("\x02FFHD4\x04", function(err) { if (err) { return console.log('Error on write: ', err.message); } console.log('hello written'); }); }); port.on('data', function (data) { console.log('Data: ' + data.toString('hex')); }); port.on('open', function() { console.log('Connected'); }); port.on('error', function(err) { console.log('Error: ', err.message); }); // close port if the script stopped (to be able to open it again) onStop(function (callback) { if (port && port.isOpen()) { port.close(); console.log('port closed'); } callback(); });
EDIT: Fehler gefunden (flache Hand vor die Stirn):
Auf dem PI läuft ja noch YAHM und darin auch ein CUxD. Und der connected automatisch alle USB Serialports solange man nicht "TTYPARAM=NONE" in der Config hat…