Forum: PC Hard- und Software Read() RS232 Linux


von Christian K. (koopson)


Lesenswert?

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

von P. S. (Gast)


Lesenswert?

Schau dir select() an.

von Christian K. (koopson)


Lesenswert?

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
Noch kein Account? Hier anmelden.