Read() RS232 Linux

OP #1313377
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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.