ifferl
05-09-2008, 10:54
Hallo,
ich versuche mit folgender Funktion die Schnittstelle für meine Waage einzustellen:
int open_port(int port)
{
/*
* RS232-Parameter
* - 1200 baud
* - 8 bits/byte
* - even parity
* - no handshake
* - 1 stop bit, Steuerzeichen deaktiviert
*/
int fd;
struct termios options;
fd = open("/dev/ttyS1", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd >= 0)
{
/* get the current options */
fcntl(fd, F_SETFL, 0);
if (tcgetattr(fd, &options) != 0) return(-1);
backup=options;
bzero(&options, sizeof(options)); /* Structure loeschen, ggf vorher sichern
und bei Programmende wieder restaurieren */
cfsetspeed(&options, B1200); /* setze 1200 bps */
/* setze Optionen */
options.c_cflag |= PARENB; /* kein Paritybit */
options.c_cflag &=~ PARODD;
options.c_cflag &=~ CSTOPB; /* 1 Stoppbit */
options.c_cflag &=~ CSIZE; /* 8 Datenbits */
options.c_cflag |= CS8;
options.c_cflag &=~ (CLOCAL);/* CD-Signal ignorieren */
options.c_cflag |= CREAD;
options.c_cflag &=~ CRTSCTS;
/* Kein Echo, keine Steuerzeichen, keine Interrupts */
options.c_iflag &=~ (IXON | IXOFF | IXANY);
options.c_lflag &=~ (ICANON | ECHO | ECHOE | ISIG);
options.c_oflag &=~ OPOST; /* setze "raw" Input */
options.c_cc[VMIN] = 1; /* warten auf min. 0 Zeichen */
options.c_cc[VTIME] = 10; /* Timeout 10 Sekunden */
options.c_cc[VSTART]= 2;
options.c_cc[VSTOP]= 27;
tcflush(fd,TCIOFLUSH);
if (tcsetattr(fd, TCSAFLUSH, &options) != 0) return(-1);
fcntl(fd, F_SETFL, FNDELAY);
fcntl(fd, F_SETFL, 0);
}
return(fd);
}
leider kann ich dann aber mir read(fd, &c, 1); keine Zeichen aus der Waage auslesen obwohl die Waage kontinuierlich sendet.
Könnten die Schnittstelleneinstellungen falsch sein?
Habt ihr eine Idee was genau falsch sein könnte?
LG
Eva
PS: Howtos zur seriellen Schnittstelle habe ich schon ausgiebig durchsucht
ich versuche mit folgender Funktion die Schnittstelle für meine Waage einzustellen:
int open_port(int port)
{
/*
* RS232-Parameter
* - 1200 baud
* - 8 bits/byte
* - even parity
* - no handshake
* - 1 stop bit, Steuerzeichen deaktiviert
*/
int fd;
struct termios options;
fd = open("/dev/ttyS1", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd >= 0)
{
/* get the current options */
fcntl(fd, F_SETFL, 0);
if (tcgetattr(fd, &options) != 0) return(-1);
backup=options;
bzero(&options, sizeof(options)); /* Structure loeschen, ggf vorher sichern
und bei Programmende wieder restaurieren */
cfsetspeed(&options, B1200); /* setze 1200 bps */
/* setze Optionen */
options.c_cflag |= PARENB; /* kein Paritybit */
options.c_cflag &=~ PARODD;
options.c_cflag &=~ CSTOPB; /* 1 Stoppbit */
options.c_cflag &=~ CSIZE; /* 8 Datenbits */
options.c_cflag |= CS8;
options.c_cflag &=~ (CLOCAL);/* CD-Signal ignorieren */
options.c_cflag |= CREAD;
options.c_cflag &=~ CRTSCTS;
/* Kein Echo, keine Steuerzeichen, keine Interrupts */
options.c_iflag &=~ (IXON | IXOFF | IXANY);
options.c_lflag &=~ (ICANON | ECHO | ECHOE | ISIG);
options.c_oflag &=~ OPOST; /* setze "raw" Input */
options.c_cc[VMIN] = 1; /* warten auf min. 0 Zeichen */
options.c_cc[VTIME] = 10; /* Timeout 10 Sekunden */
options.c_cc[VSTART]= 2;
options.c_cc[VSTOP]= 27;
tcflush(fd,TCIOFLUSH);
if (tcsetattr(fd, TCSAFLUSH, &options) != 0) return(-1);
fcntl(fd, F_SETFL, FNDELAY);
fcntl(fd, F_SETFL, 0);
}
return(fd);
}
leider kann ich dann aber mir read(fd, &c, 1); keine Zeichen aus der Waage auslesen obwohl die Waage kontinuierlich sendet.
Könnten die Schnittstelleneinstellungen falsch sein?
Habt ihr eine Idee was genau falsch sein könnte?
LG
Eva
PS: Howtos zur seriellen Schnittstelle habe ich schon ausgiebig durchsucht