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


Anmelden zum Antworten