String.h lib Programm bleibt stehn. GCC + Debian. Bleibt am Read stehen
-
Hallo,
ich bin langsam am verzweifeln...Ich bastel gerade ein Programm was von der Seriellen Konsole Absätze ließt.
Ein bisschen was habe ich schon geschaft, aber ab und an macht der Kompiler komische sachen. Ich habe viele printf's eingefügt um zu sehen was passiert wenn es klappt wollte ich diese entfernen, aber komischer weise nach dem entfernen hängt das Programm?!?!
Ich habe auch schon mit gbd geguckt an was es hängt. Es hängt sich immer an der read der Schnittstelle auf?! Auch mache String.h funktionen gehen erst nach vielen hin und her?!?!
Ich dreh durch
Kleine änderung an den Prints und nix geht mehr????!?!
Und dann habe ich noch was ich bekomme es nicht hin das Char umzukopieren:
char string2[20]="red dwarf";
char string1[20]="";
strcpy(string1, string2);Da hängt alles wieder..
Es wäre toll wenn mir jemand helfen könnte.
Danke
Athlon
Hier mal mein Code:
/* lesen.c */ #include <termios.h> #include <fcntl.h> #include <sys/ioctl.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #define BUFFSIZE 1 #define LINE_LENGTH 80 int ueber; char bezugeweroh[100] = ""; char lieferungeweroh[100] = ""; char bezugewe[200]; char lieferungewe[200]; //Port öffnen int openserial(char *devicename) { int fd; struct termios attr; if ((fd = open(devicename, O_RDWR )) == -1) { perror("openserial(): open()"); return 0; } } // Port einstellen int configure_port(int fd) { struct termios port_settings; // structure to store the port settings in cfsetispeed(&port_settings, B300); // set baud rates cfsetospeed(&port_settings, B300); port_settings.c_cflag |= PARENB; // setze 7E1 port_settings.c_cflag &= ~PARODD; port_settings.c_cflag &= ~CSTOPB; port_settings.c_cflag &= ~CSIZE; port_settings.c_cflag |= CS7; port_settings.c_lflag = ICANON; tcsetattr(fd, TCSANOW, &port_settings); // apply the settings to the port return(fd); } //Port Schliessen void closeserial(int fd) { close(fd); fprintf(stderr, "Port geschlossen\n"); } //Senden int sendenserial(int fd) { char n; //fd_set rdfs; //Sende /?!crlf unsigned char send_bytes[] = { 0x2F, 0x3F, 0x21, 0x0D, 0x0A}; write(fd, send_bytes, 5); //Send data printf("Daten senden\n"); return 0; } //Port auf Empfang void portempfang(int fd) { int sercmd, serstat; sercmd = TIOCM_RTS; ioctl(fd, TIOCMBIC, &sercmd); // Reset the RTS pin. // Read the RTS pin status. ioctl(fd, TIOCMGET, &serstat); if (serstat & TIOCM_RTS) printf("RTS pin is set.\n"); else printf("RTS pin is reset.\n"); } //Port auf Senden void portsenden(int fd) { int sercmd, serstat; sercmd = TIOCM_RTS; ioctl(fd, TIOCMBIS, &sercmd); // Set the RTS pin. // Read the RTS pin status. ioctl(fd, TIOCMGET, &serstat); if (serstat & TIOCM_RTS) printf("RTS pin is set.\n"); else printf("RTS pin is reset.\n"); } //Ende des Streams finden int read_ende(char s1[100]) { char str[10] = "!\r\n"; if (strstr(s1, str)) { printf("OKstrstr"); ueber = 1; } else { ueber = 0; } printf("Vergleich %s == %s\n",s1,str); } //Baustelle///////////////////////////////////// //Strings finden int find (char s1[100]) { //1-1:1.8.0 Bezug //1-1:2.8.0 Lieferung char bezug[20] = "1-1:1.8.0("; char liefer[20] = "1-1:2.8.0("; char *ptr; if(strncmp( s1, bezug, 10) == 0) { printf("Bezug"); //TEST char string2[20]="red dwarf"; char string1[20]=""; strcpy(string1, string2); // } if(strncmp( s1, liefer, 10) == 0) { printf("Liferung\n"); } printf("In %s vorhanden(%s)\n",s1,bezug); printf("In %s vorhanden(%s)\n",s1,liefer); } /////////////////////////////////////////////////////////// //lesen der Ports void readserial_1(int fd) { char buf[50]; int res=0; int i=0; int ende; ueber = 0; do{ //Vom Port lesen res = read(fd,buf,sizeof(buf)-1); //String terminieren buf[res] = '\0'; printf("Buffer:%s\n",buf); //Das Ende des Streams finden ende = read_ende(buf); //Finden der beiden Strings find(buf); //printf("ENDE=%d\n",ueber); i++; }while(ueber != 1); return; } //Hauptschleife int main() { int fd; char *serialdev = "/dev/ttyS0"; //öffnne fprintf(stderr, "Port öffnen\n"); fd = openserial(serialdev); if (!fd) { fprintf(stderr, "Error while initializing %s.\n", serialdev); return 1; } //config fprintf(stderr, "Port einstellen\n"); configure_port(fd); //auf senden stellen portsenden(fd); //sende sendenserial(fd); //warten sleep(1); //auf empfangen stellen portempfang(fd); sleep(1); readserial_1(fd); //schliessen fprintf(stderr, "Port schliessen\n"); closeserial(fd); //printf("%s\n",lieferungeweroh); //printf("%s\n",bezugeweroh); return(0); }
-
Kannst du lesen?
Ja? Warum liest du dann die Überschrift dieses Subforums nicht?
Da steht (zum Mitlesen:):
Fragen zur Seriellen-Schnittstelle oder ähnliches haben nichts mit C zu tun. Bitte dies in den entsprechenden Foren (Unix, DOS, WinAPI, Rund Um Die Programmierung) posten. Danke
-
Ist ja eher ein C Problem....ob ich nun ne Datei oder die Serielle Schnittstelle lese ist doch egal....
-
Beseitige erstmal alle Compilerwarnungen (setzte den Warnlevel auf Maximum)
Überprüfe auch wie die die Bibliotheken dazu bindest.
Minimiere das Programm soweit, bis der Fehler nicht mehr auftritt bzw. gerade noch auftritt.
-
Ja das hab ich schon versucht
aber irgendwie ist das sehr komisch
Code Technisch ist das doch ok oder?
//TEST
char string2[20]="red dwarf";
char string1[20]="";
strcpy(string1, string2);
//