moin, ich habe mal ein frage zur read() Funktion. Folgene Einstellungen für den Port gebe ich mit. //Keine Flusskontrolle .... options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); options.c_oflag &= ~OPOST; options.c_cc[VMIN] = 6; // Anzahl Zeichen options.c_cc[VTIME] = 4; // Timeout Zeichen usleep(100) fcntl(hCom, F_SETFL, FNDELAY); // NO Blocking int read(...) Eigentlich bin damit ganz glücklich. Die Schnittstelle kehrt sofort zurück, wenn nichts im Buffer zum lesen liegt. Allerdings wäre es schön wenn es da eine Funktion wie tcdrain(int fd) geben würde, damit read wartet bis was im buffer ist. Ich meine da schon irgentwie was gelesen zu haben. Momentan habe ich es mit einem zusätzlichen usleep bzw. nochmaligen Aufruf von read() gelöst. Grund: Nach jedem Schreibbefehl, muss (will) ich mit read abfragen ob die Ansteuerung der Relais geklappt hat und das möglichst ohne Zeitverzug. Hat einer von euch eine Idee? Gruss
moin, ich habe mir mal select angeschaut. aber grundsätzlich kann ich da keine vorteil feststellen. damit ich ständig einen timeout bekomme, hätte muss ich die zeit min. auf 250 usec stellen. da kann ich auch die alte methode nehmen. gibs da noch andere möglichkeiten? kann ja nicht sein, das ich da bis zu 250 usec warten muss... code ... int readport(char *result) { //usleep(10000); //fcntl(hCom, F_SETFL, FNDELAY); //printf("\n%d\n", hCom); int retval, fd; fd_set read_fds; struct timeval tv; fd = hCom; FD_ZERO(&read_fds); FD_SET(fd,&read_fds); tv.tv_sec = 0; tv.tv_usec = 250; retval = select(fd+1,&read_fds,NULL,NULL,&tv); if(retval) { int iIn = read(hCom, result, MAXARRAY); else { printf("Timeout"); } return NOERROR; }
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.