Forum: PC-Programmierung Serielle Schnittstelle Unix Problem !


von macke_a (Gast)


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

von Roland Praml (Gast)


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);

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.