Hallo Zusammen,
ich verwendet die tcdrain(fd); Funktion zum prüfen,
ob die entsprechenden Zeichen auch wirklich raus sind,
damit ich auf eine entsprechende Antwort warten kann.
Das klappt auch prima, nur wenn ich den Fehlerfall habe,
und zum Beispiel kein Gerät angeschlossen habe,
wird die Funktion tcdrain() nicht beendet.
Hier meine Settings:
cfmakeraw(&term_attr);
term_attr.c_cc[VMIN] = 0; // finished even if no byte
term_attr.c_cc[VTIME] = 10; // 1000ms
term_attr.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON | IUCLC | INLCR| IXANY );
/* output modes - clear giving: no post processing such as NL to CR+NL */
term_attr.c_oflag &= ~(OPOST|OLCUC|ONLCR|OCRNL|ONLRET|OFDEL);
/* control modes - set 8 bit even partiy 1 stop bit*/
term_attr.c_cflag |= (CS8 | PARENB);
/* local modes - clear giving: echoing off, canonical off (no erase with
backspace, ^U,...), no extended functions, no signal chars (^Z,^C) */
term_attr.c_lflag &= ~(ECHO | ECHOE | ICANON | IEXTEN | ISIG);
term_attr.c_cflag |= CRTSCTS; // using flow control via CTS/RTS
Hat jemand eine Idee ?
Oder kann man tcdrain ersetzen durch ...
Hier mein möglicher workaround
/****************************************************************************/
// Waiting until all data written to the serial port
/****************************************************************************/
int mytcdrain( int fd )
{
int timeoutcounter=10; // Timeout counter
int bytesToSend=1; // Byte to send in buffer
int lastByteToSend=1; // last value of send bytes in buffer
while( timeoutcounter > 0 // Timeout not elapsed
&& bytesToSend > 0) // still bytes to send
{
ioctl(fd ,TIOCOUTQ, &bytesToSend); // state of the buffer
if( lastByteToSend != bytesToSend) // does the value changed
{
timeoutcounter=9; // reset timeout transmit is running
lastByteToSend = bytesToSend; // remember the byte to transmit
}
else
{
usleep(10000); // 10000 ysec no bytes transmit (wait)
timeoutcounter--; // counting for error state (abort)
}
}
if( timeoutcounter == 0 ) // nothing transmitted
tcflush( fd, TCOFLUSH); // clear transmitbuffer of system
return ( timeoutcounter != 0); // if finished with value -> ok
}
Den muss ich aber erstmal testen. Anmerkungen sind gerne gesehen.
Gruss Ritchie
Wie kann ich asynchron über Änderungen der DTR und DSR Leitungen auf der seriellen Schnittstelle benachrichtigt werden. Bisher hab ich nur einen Weg gefunden den Status direkt abzufragen, das würde aber auf Pollen hinauslaufen. Klar kann man das Pollen in einen extra Thread auslagern, echte asynchrone Mitteilung wäre aber besser.
#include <unistd.h>
#include <termios.h>
void function()
{
int fd;
int status;
ioctl(fd, TIOCMGET, &status);
if (serial & TIOCM_DTR)
{
}
}
Nur so nebenbei: Das sieht sehr nach Java-Code aus. Wie bekommt man Java-Programmierer dazu, unter C++ nicht alles über Zeiger auf den Heap zu legen? Lege ich eine Instanz im Konstruktor an und lösche sie im Destruktor wieder, dann brauche ich sie nicht als Heap-Objekt anzulegen.
meine Güte, gibst denn nicht auf? Hier wird dir keiner helfen, Rootkit-Schreiben zu lernen.
Der 2-6.x Kernel hat einen speziellen Schutz des Bereichs, wo die Syscall-table sich befindet, damit sowas nicht geht. Findet dich damit aus.
mase schrieb:
So hat's funktioniert:
sprintf(modify_command, "%s \"%s\"", "modify-mp3.sh", ices_config.pm.get_next ());
Danke!
Das war doch genau Dein ursprünglicher Ansatz. Nur dass Du aus - mir unverständlichen Gründen - oben noch Leerzeichen dazwischengepackt hast.
Naja, Hauptsache, die Sache ist erledigt, hatte Deine Frage irgendwie falsch verstanden.
+fricky schrieb:
_________ schrieb:
Besonders schlecht scheint er aber auch nicht zu sein.
Sein Buch "C++ von A bis Z" hat bei Amazon 11 x 5 Sterne und 1 mal 4 Sterne.
sein ähnlich klingendes machwerk 'c von a bis z' wurde im hiesigen c-forum regelmässig zerrissen, wegen der viele fehler, die da drin sind.
es gibt das Gerücht, das buch soll aber angeblich die vielen Fehler der online Ausgabe beseitigt haben. Ob das stimmt, weiß ich nicht. Als wir uns vor langer Zeit beim Online-Ausgabe-Forum über die Fehler beschwert haben, hat ein Mod den Thread dicht gemacht.
also wenn du das mit select() machst dann wird das signalisiert und das kannst du abfangen - ich glaube es wird -1 oder 0 zurückgegeben. schau dir einfach mal die man-page von select() an.
blan
Hi,
der Parameter "| O_NDELAY" sorgt dafür, das der Aufruf sofort beendet wird,
wenn kein Zeichen vorhanden ist. Lasse diesen Parameter mal weg.
Schau mal hier, das könnte Dir helfen. Leider kämpfe ich derzeit auch mit einer RS232 Verbindung. Hier jedoch mit einem Handshake, wo mir Zeichen verloren gehen.
http://www.c-plusplus.net/forum/viewtopic-var-t-is-240887.html
Deine Routine sollte damit aber zu bedienen sein.
Verwende die Init und tty_read() .
Gruss