Read() RS232 Linux

OP #1313377
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
OP #1316242
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;
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren