mikrocontroller.net

Forum: PC-Programmierung Serielle Schnittstelle Unix Problem !


Autor: macke_a (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo !

Ich versuche über meine serielle Schnittstelle Daten einzulesen. Dazu 
verwendete ich eine Terminal Umgebung "Bin Term". Allerdings möchte ich 
reine Netto Daten, ohne das Einfügen von LF einlesen.
Dabei habe ich folgende Eigenschaft als Problem die ich nicht verstehe:

1. Versuch:
Ich sende "TEST" ohne LF, so nimmt er die Daten nicht!
2.Versuch:
Ich sende "TEST" mit LF, so nimmt er die Daten!
3.Versuch:
Ich sende "TEST ohne LF, ab jetzt nimmt er die Daten immer an. Ich 
brauche keine LF mehr einfügen!
Habe ich eventuell falsche Einstellungen bei meine C - Routine:


bool SerialConfigurePort( int aFile, speed_t aSpeed ) {

struct termios ti;
unsigned long arg = 0;

tcflush( aFile, TCIOFLUSH );

if( tcgetattr( aFile, &ti ) >= 0 ){
cfmakeraw(&ti);

ti.c_cflag |= CLOCAL;
ti.c_cflag &= ~CRTSCTS;
ti.c_cflag &= ~PARENB;
ti.c_cflag &= ~PARODD;
ti.c_cflag &= ~CSIZE;
ti.c_cflag |= CS8;
ti.c_cflag &= ~CSTOPB;

ti.c_iflag |= (IGNPAR | ICRNL );

ti.c_cc[ VMIN ] = 1;
ti.c_cc[ VTIME ] = 0;

cfsetspeed( &ti, aSpeed );

if( tcsetattr( aFile, TCSANOW, &ti ) >= 0 ) {
arg = fcntl( aFile, F_GETFL, 0 );
arg |= O_NONBLOCK;

if( fcntl( aFile, F_SETFL, arg ) >= 0 ) {
return true; } }
}
return false; }

Wäre dankbar für ne Antwort bzw. ne Korrektur meiner Routine!
Ich suche seit ca. 12 Stunden nach meiner Problem, aber ich habe bis 
jetzt keinen Idee wie ich das Problem lösen kann, das ich die Daten ohne 
LF einlesen kann!!

Freundliche Grüsse Marco

Autor: Roland Praml (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Überprüf mal wie du das device öffnest und mach mal das ICRNL weg udn 
setz CREAD, das ist der einzige großartige Unterschied zu meiner 
Routine, und die empfängt jedes byte:
...
  fd = open(PLMDEVICE, O_RDWR | O_NOCTTY );
...
  bzero(&newtio, sizeof(newtio));
  newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;
  newtio.c_iflag = IGNPAR;

  newtio.c_oflag = 0;
  newtio.c_lflag = 0;

  newtio.c_cc[VTIME]    = 0;   /* inter-character timer unused */
  newtio.c_cc[VMIN]     = 1;   /* blocking read until 1 chars received */

  tcflush(fd, TCIFLUSH);
  tcsetattr(fd,TCSANOW,&newtio);

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.