www.mikrocontroller.net

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


Autor: Christian Koopson (koopson)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau dir select() an.

Autor: Christian Koopson (koopson)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.