- 12V Akku mit 280 Ah bauen         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: string an lcd senden, string in pointer speichern

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    20.07.2008
    Ort
    Herford
    Alter
    40
    Beiträge
    52

    string an lcd senden, string in pointer speichern

    Anzeige

    LiFePo4 Akku selber bauen - Video
    hallo mic,
    und alle anderen microcontroller freunde.

    weiß einer von euch wieso ich zwar folgendermassen einen string ans lcd senden kann:


    Code:
    .
    void LCD_WriteString(unsigned char *string)
    {
       while(*string)
       {
          LCD_WriteZeichen(*string++);    // zeichen am LC-Display ausgeben               
       }
    
    void main (void)
    {
       unsigned char buffer[]="hallo";
    
          LCD_Init();
    
       LCD_WriteString(buffer);
    
       while(1);
    }
    aber in der folgenden form:
    Code:
    void main (void)
    {
    
          LCD_Init();
    
       LCD_WriteString("hallo..");
    
       while(1);
    }
    diese compiler fehlermeldungen bekomme?
    196:Warning [2054] suspicious pointer conversion

    sie bezieht sich auf "LCD_WriteString("hallo..");"



    LCD_WriteZeichen('H'); klappt doch auch.
    ich ich müsste einem pointer wie *string ja auch in folgender vorm was zuweisen können:

    string="hallo"; oder liege ich da falsch und er schickt <hallo> ins nirvana???


    hoffe jemand kann mir helfen

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    06.06.2007
    Ort
    Aurich
    Beiträge
    36
    Naja, wenn ich das richtig sehe (mein C is nich das beste...):

    Beim ersten beispiel wird LCD_WriteString ein "Pointer to String" übergeben, beim zweiten Beispiel wird aber ein String übergeben obwohl ein "Pointer to String" erwartet wird.

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    02.11.2005
    Beiträge
    1.614
    Sieht auch so aus als wenner einen Pointer erwartet. Aber: Es ist auch ein Unterschied ob man 'H' oder "H" übergibt!

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.03.2006
    Ort
    Darmstadt
    Alter
    33
    Beiträge
    522
    Die Fehlermeldung kommt daher, dass eine konstante Zeichenkette aus chars besteht, die Funktion LCD_WriteString() aber einen Zeiger auf unsigned char erwartet. Wenn man mit Strings arbeitet, sollte man immer nur chars verwenden, auch wenn es auf dem benutzten System dasselbe ist wie unsigned char.

    MfG Mark

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    20.07.2008
    Ort
    Herford
    Alter
    40
    Beiträge
    52
    hallo pic freunde, danke für die schnellen antworten,

    leider bekomme ich wenn ich in der funktion LCD_WriteString() char statt unsigned char verwende folgende fehlermeldung:

    197:Warning [2066] type qualifier mismatch in assignment

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.03.2006
    Ort
    Darmstadt
    Alter
    33
    Beiträge
    522
    Was genau steht in Zeile 197?

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    20.07.2008
    Ort
    Herford
    Alter
    40
    Beiträge
    52
    in zeile 197 stand: LCD_WriteString(" ,wie geht's");

    hab es etwas abgeändert, jetzt bezieht sich der fehler zwar auf eine andere zeile, aber das ist ja unwichtig, es geht um die gleiche funktion.

    Code:
    /** D E F I N I T I O N S ****************************************************/
    
    #define PORTLCD 	LATB
    #define TRIS_LCD    TRISB
    #define LCD_E		PORTBbits.RB0
    #define LCD_RS		PORTBbits.RB2
    #define LCD_RW		PORTBbits.RB3
    #define nop			_asm nop _endasm
    
    /****************************************************************************
    /*****************************************************************************/
    //#pragma udata glob_point  
    
    /*****************************************************************************/
    
    #pragma code
    
    /**delay for  PicLSBK (16MHz Taktzyklus = 4 MHz Befehlszyklus)*****************/
    void delay100us(unsigned char multiplikator)
    {
       while(multiplikator--) Delay10TCYx(40);   //40*10*0,25µs = 100 µs
    }
    /****************************************************************************/
    
    
    void enable(void)
    {
     	nop;  
    	LCD_E = 1;                // Daten übernehmen
    	delay100us(1);
       	LCD_E = 0;
    	nop;
    }
    
    
    /**LCD_BUSY*****************************************************************/
    void LCD_BUSY(void)
    {
    	unsigned char temp1;
    	do
    	{
    		TRIS_LCD = 0xF0; 		// LCD-PORT = high nibbles:eingang; low nibbles:ausgang
    //Display abfrage
    		LCD_RS = 0; 			// LCD im Befehls-Mode
    		LCD_RW = 1; 			// LCD im Lesen-Mode	
    		enable();				
    		temp1 = PORTLCD;
    					
    		temp1 = temp1 & 0x80;		
    
    		enable();		 		// high nibble abfragen (wird für busy-flag abfrage nich weiter benötigt) 
    	} while (temp1==0x80);		// wiederhole schleife bis busy-flag (LCD DATA PIN D7) low
    		
    	delay100us(2);
    	LCD_RW = 0; 		 // Busy = low: LCD im Schreiben-Mode
    	TRIS_LCD = 0x00;     // LCD-PORT = Ausgänge
    	PORTLCD  = 0x00;	 // Daten und Steuerleitungen LOW
    } 
    
    
    void LCD_WriteZeichen( char zeichen)
    {
    	unsigned char x;
    	
    	LCD_BUSY(); 				// Warten bis LCD bereit ist
    	
    	x = zeichen & 0xf0;
    	PORTLCD = x;				// höherwertiges nibbel an LCDPORT übergeben
    	LCD_RS = 1; 				// LCD im Daten-Mode
    	LCD_RW = 0; 				// LCD im Schreiben-Mode
    	enable();					// high nibble bei fallenden Flanke von enable an LCD senden 
    
    	x = zeichen;			
    	x = (x << 4)& 0xf0;			//niederwertiges nibbel an LCDPORT übergeben
    	PORTLCD = x;
    	LCD_RS=1;
    	LCD_RW = 0; 				
    	enable();					// low nibble bei fallenden Flanke von enable an LCD senden 
    
    	LCD_RS = 0;
    	PORTLCD  = 0x00;	 		// Daten und Steuerleitungen LOW
    }
    
    void LCD_WriteString(char  *string) 
    {
    unsigned char temp;
    	
    	temp=*string;
    	while(temp)
    	{
    		LCD_WriteZeichen(temp); 	// zeichen am LC-Display ausgeben					
    		string++; 
    		temp=*string;
    	}
    }
    
    
    void LCD_WriteRegister(unsigned char data) 
    {
    	unsigned char x;
    	
    	LCD_BUSY(); 				// Warten bis LCD bereit ist
    					
    	x = data & 0xf0;
    	PORTLCD = x;				//höherwertiges nibbel an LCD senden
    	LCD_RW = 0; 				// LCD im Schreiben-Mode
    	LCD_RS = 0; 				// LCD im Befehl-Mode
    	enable();
    					
    	x = data;			
    	x = (x << 4)& 0xf0;			//niederwertiges nibbel an LCD senden
    	PORTLCD = x;
    	enable();	
    }
    
    
    void LCD_Init(void) 
    {
    // LCD initialisieren
    
    	TRIS_LCD = 0x00;     // LCD-PORT = Ausgänge
    	PORTLCD  = 0x00;	 // Daten und Steuerleitungen LOW
    
    
    	delay100us (151);
    	delay100us (151);			// warte über 30ms
    
    
    	PORTLCD = 0x30;				// Interface auf 8-Bit setzen						
    	enable();
    	
    	delay100us(46);				//warte 4,5ms
    								
    			 					// Interface auf 8-Bit setzen
    	enable();					// Enable (LCD)					
    
    	delay100us(2);				//warte 100µs
    								
    	enable(); 					// Interface auf 8-Bit setzen
    								// Enable (LCD)				
    
    	delay100us(2);				//warte 100µs
    	
    	PORTLCD = 0x20;				// Interface auf 4-Bit setzen
    	enable();					// Enable (LCD)
    						
    	LCD_WriteRegister(0x28);	// 2-zeilig, 5x8-Punkt-Matrix
    	LCD_WriteRegister(0x08);  	// Display aus	
    	LCD_WriteRegister(0x01); 	// Display löschen
    	LCD_WriteRegister(0x06); 	// Kursor nach rechts wandernd, kein Display-Shift
    	LCD_WriteRegister(0x0f); 	// Display ein  [ 0x0C = ein, 0x08 = aus ] 
    }
    
    
    void main (void)
    {
       	LCD_Init();
    
    	LCD_WriteZeichen('H');
    	LCD_WriteZeichen('a');
    	LCD_WriteZeichen('l');
    	LCD_WriteZeichen('l');
    	LCD_WriteZeichen('o');
    
    	LCD_WriteString(" ,wie geht's");    // compiler meldet Warning [2066] type qualifier mismatch in assignment
    
    	while(1);
    }
    wodrann kann das liegen

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    hallo,
    wie wäre es, wenn Du den char Zeiger in unsigned char Zeiger castest ?

    Oder noch besser deine LCD_WriteString Funktion umänderst, daß sie einen Zeiger auf char erwartet.
    Gibt es einen Grund, warum der Zeiger unsigned char ist ?

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    20.07.2008
    Ort
    Herford
    Alter
    40
    Beiträge
    52
    der einzige grund ist ich wusste es nicht besser

    wie kann ich das den bewerkstelligen das die funktion LCD_WriteString einen zeiger auf string erwartet?

    void LCD_WriteString(char *string) // siehe code oben

    klappt nicht.

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Es gibt in C keine Zeiger auf String.
    Es gibt auch keine Strings so wie man sie von Java oder so kennt.
    In C ist ein String ein char Array, das mit einem 0 (kein '0') terminiert ist.

    Wenn man jetzt eine Funktion schreiben will, die einen Zeiger auf ein char Array schlucken soll, muß man sie wohl so definieren
    Code:
    void LCD_WriteString(char* string);
    Irgendwie logisch.

    Bedenke, der Kompiler warnt Dich, daß da was nicht passt,
    es ist kein Fehler.
    Dein Code müßte trotzdem übersetzt und richtig ausgeführt werden.
    Man soll keine Warnungen ignorieren, diese fällt aber in die Kategorie,
    nicht wichtig.
    Um Ruhe zu kriegen ist es natürlich sinnvoll unsigned an der Stelle wegzulassen.

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen