Serielle Schnittstelle Unix Problem !

Gast #513937
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
Gast #513959
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:
1
...
2
  fd = open(PLMDEVICE, O_RDWR | O_NOCTTY );
3
...
4
  bzero(&newtio, sizeof(newtio));
5
  newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;
6
  newtio.c_iflag = IGNPAR;
7

8
  newtio.c_oflag = 0;
9
  newtio.c_lflag = 0;
10

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

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

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