PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Waage über RS232 ansteuern C



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

ifferl
08-09-2008, 11:52
Hallo,

die Waage gibt folgende Einstellungen vor:
Baudrate: 1200
Parity: even
Datenbits: 8
Startbit: 1
Stopbit: 1
kein Hardware Handshake

Kann mir vielleicht jemand von Euch helfen?
Ich kann den Fehler einfach nicht finden.
Für Hinweise wäre ich sehr dankbar.

Eva

ifferl
16-09-2008, 11:47
Hallo,

das lesen klappt nun so einigermasen; nun machen mir die Steuerzeichen einige Probleme. Das Startzeichen wird hier nur ein bis zweimal gefunden und dann werden nur noch leere Zeichen gelesen.
Woran kann das liegen? liegt das an den Steuerzeichen?


while (fgew == 0 && zeit < 10) /* Gewicht lesen*/
{
lseek(fd, 0, SEEK_SET);
tcflush(fd, TCIFLUSH); //flush port
zeit1=0;
while (c != '\x02' && zeit1 < 100) /* suche Startzeichen*/
{
j=read(fd, &c, 1);
printf("lc: %x j: %i\n",c, j);
sleep(0.05);
zeit1++;
}
if (c == '\x02') //Start
{
x = 0;
while (c != '\x03' && x<58) /*bis zum Ende (oder max. 58 Zeichen) lesen*/
{
read(fd, &c, 1);
printf("c: %c\n", c);
erg[x] = c;
x++;
}
}
fgew = decode_scalesdata(erg);
zeit++;
}

Temp
21-09-2008, 21:41
protokollier doch einfach mal mit was die waage sendet mit einem terminalprogramm

sie sendet ja von sich aus oder?

dann dürfte es leichter sein die messages auseinanderzudividieren

gruß temp

ifferl
26-09-2008, 09:44
am Anfang kommen genau die gewünschte Zeichen an; nach einigen Durchläufen werden jedoch nur leere/keine Zeichen ausgegeben und das read() gibt -1 zurück
Ich vermute hier einen Pufferüberlauf oder ein Problem mit den Steuerzeichen. Die Waage verwendet folgende Steuerzeichen: STX, ETX, LF, CR

Beatkiller
27-09-2008, 11:06
Ein Pufferüberlauf kann es schlecht sein, c ist ein char und du liest genau ein Zeichen aus. Evtl musst du das Teil nach jedem Durchlauf resetten? Da keine Referenz oder auch nur der Typ der Waage angegeben ist, kann man da nur Rätselraten. BTW: kannst du deinen Code in die dafür vorgesehenen Tags packen, so macht das lesen keinen Spaß.

Temp
12-10-2008, 13:48
du kannst natürlich auch immer nur ein zeichen (byte) auslesen und dann bei dir in der applikation zusammenbauen

z.B. immer auf STX aufsynchronisieren und bei einem ETX das telegramm schließen und verarbeiten