-
        

Ergebnis 1 bis 2 von 2

Thema: T6963C Stringproblem [gelöst]

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190

    T6963C Stringproblem [gelöst]

    Anzeige

    Hallo Zusammen,

    ich habe ein Problem mit mehreren Strings in einer Zeile eines Grafikdisplays mit T6963C Controller.
    Ich benutze die Routinen von Nico Sachs (im Anhang).

    Folgendes Verhalten:
    Ich habe eine Menüebene in der ich Werte anzeige.
    Diese Werte sind aus mehreren Strings zusammengesetzt, weil ich möglichst wenig Zeit für die Datenübertragung zum Display opfern will.
    Bei erstmaligem Eintritt in diese Menüebene funktioniert die Anzeige auch Problemlos, aber bei Wiedereintritt aus einer anderen Menüebene heraus werden anscheinend die Startpositionen verschoben und es kommt nur Murks auf dem Display an.

    Hier mal mein Menüteil:
    Code:
    void screen_gps(void)
    {
    	/*Variablendeklaration für Menüebene*/
    	static char cog_comp [7];
    	static char sog_comp [7];
    	static char lat_deg_comp [4];
    	static char lat_min0_comp [4];
    	static char lat_min1_comp [5];
    	static char lon_deg_comp [5];
    	static char lon_min0_comp [4];
    	static char lon_min1_comp [5];
    
    	if(menu.do_once == 0)
    	{
    		glcd_clear_text();
    		glcd_clear_graph();
    
    		glcd_line(0, 9, 239, 9, 1);
    
    		glcd_print2_P(0,80, "Kurs:", &Arial__10, 0);
    		glcd_print2_P(0,98, "Geschw.:", &Arial__10, 0);
    
    		/*Funktionsanzeige der Tasten*/
    		glcd_line(0, 118, 239, 118, 1);
    		glcd_print(35, 15, "Menü");
    	}
    			
    	//gpsdaten auswerten
    
    	if(rmc.status == 1)
    	{
    		/*Display time*/
    
    		if ((rmc.utc_time [2] == '0' && rmc.utc_time [3] == '0') || menu.do_once == 0)
    		{
    			char hr_temp [4];
    			char date_temp [9];
    			int8_t hr_calc;
    
    			hr_temp [0] = rmc.utc_time [0];
    			hr_temp [1] = rmc.utc_time [1];
    			hr_temp [2] = '\0';
    
    			hr_calc = atoi (&hr_temp [0]);
    			hr_calc += menu.timezone;
    			hr_calc += menu.summer;
    
    			if (hr_calc < 0)
    			{
    				hr_calc += 24;
    			}
    			else if (hr_calc >= 24)
    			{
    				hr_calc -= 24;
    				//inc date
    			}
    
    			if (hr_calc <= 9)
    			{
    				hr_temp [0] = '0';
    				menu.temp = 1;
    			}
    			else
    			{
    				menu.temp = 0;
    			}
    			
    			utoa (hr_calc, &hr_temp [menu.temp], 10);
    			hr_temp [2] = ':';
    			hr_temp [3] = '\0';
    
    			date_temp [0] = rmc.date [0];
    			date_temp [1] = rmc.date [1];
    			date_temp [2] = '.';
    			date_temp [3] = rmc.date [2];
    			date_temp [4] = rmc.date [3];
    			date_temp [5] = '.';
    			date_temp [6] = rmc.date [4];
    			date_temp [7] = rmc.date [5];
    			date_temp [8] = '\0';
    
    			glcd_print (32, 0, &hr_temp [0]);
    			glcd_print (0, 0, &date_temp [0]);			
    		}
    
    		if ((rmc.utc_time [4] == '0' && rmc.utc_time [5] == '0') || menu.do_once == 0)
    		{
    			char min_temp [4];
    
    			min_temp [0] = rmc.utc_time [2];
    			min_temp [1] = rmc.utc_time [3];	
    			min_temp [2] = ':';
    			min_temp [3] = '\0';
    
    			glcd_print (35, 0, &min_temp [0]);
    		}
    
    		glcd_print (38, 0, &rmc.utc_time[4]);
    
    		/**/
    
    		if (strcmp (rmc.cog, cog_comp) != 0)
    		{
    			uint8_t len_cog = (6 - strlen (rmc.cog));
    			uint8_t i;
    
    			for (i = 0; i <= len_cog; i++)
    			{
    				glcd_print2_P (80 + (i * 12), 80, " ", &Arial__10N, 0);
    			}
    
    			
    			glcd_print2 ((80 + (len_cog * 12)), 80, &rmc.cog [0], &Arial__10N, 0);
    			glcd_print2 (200, 80, "°", &Arial__10N, 0);
    			strcpy (&cog_comp [0], &rmc.cog [0]);
    		}
    
    		if (strcmp (rmc.sog, sog_comp) != 0)
    		{
    			uint8_t len_sog = (6 - strlen (rmc.sog));
    			uint8_t i;
    
    			for (i = 0; i <= len_sog; i++)
    			{
    				glcd_print2_P (80 + (i * 12), 98, " ", &Arial__10N, 0);
    			}
    			
    			if (rmc.sog [0] == 0)
    			{
    				glcd_print2_P (116, 98, "-.--", &Arial__10N, 0);
    			}
    			else
    			{
    				glcd_print2 ((80 + (len_sog * 12)), 98, &rmc.sog [0], &Arial__10N, 0);
    			}
    			glcd_print2 (200, 98, "kn", &Arial__10, 0);
    			strcpy (&sog_comp [0], &rmc.sog [0]);
    		}
    
    		/*print latitude if changed*/
    		if (strncmp (rmc.lat, lat_deg_comp, 2) != 0 || menu.do_once == 0)
    		{
    			strncat (&lat_deg_comp [0], &rmc.lat [0], 2);
    			strcat (&lat_deg_comp [2], "°");
    			glcd_print2 (18, 12, &lat_deg_comp [0], &Arial__10N, 0);
    		}
    
    		if (strncmp (&rmc.lat [2], &lat_min0_comp [0], 2) != 0 || menu.do_once == 0)
    		{
    			strncat (&lat_min0_comp [0], &rmc.lat [2], 3);
    			glcd_print2 (71, 12, &lat_min0_comp [0], &Arial__10N, 0);	
    		}
    
    		if (strncmp (&rmc.lat [5], &lat_min1_comp [0], 4) != 0 || menu.do_once == 0)
    		{
    			strncat (&lat_min1_comp [0], &rmc.lat [5], 4);
    			glcd_print2 (125,12, &lat_min1_comp [0], &Arial__10N, 0);	
    		}
    
    		/*print longitude if changed*/
    		if (strncmp (rmc.lon, &lon_deg_comp [0], 3) != 0 || menu.do_once == 0)
    		{
    			strncat (&lon_deg_comp [0], &rmc.lon [0], 3);
    			lon_deg_comp [3] = '°';
    			lon_deg_comp [4] = '\0';
    			glcd_print2 (0, 38, &lon_deg_comp [0], &Arial__10N, 0);
    		}
    
    		if (strncmp (&rmc.lon [3], &lon_min0_comp [0], 2) != 0 || menu.do_once == 0)
    		{
    			strncat (&lon_min0_comp [0], &rmc.lon [3], 3);
    			glcd_print2 (71, 38, &lon_min0_comp [0], &Arial__10N, 0);	
    		}
    
    		if (strncmp (&rmc.lon [6], &lon_min1_comp [0], 4) != 0 || menu.do_once == 0)
    		{
    			strncat (&lon_min1_comp [0], &rmc.lon [6], 4);
    			glcd_print2 (125,38, &lon_min1_comp [0], &Arial__10N, 0);	
    		}
    	}
    	else
    	{
    		//keine Navigation möglich!
    	}
    			
    		//glcd_print2((120-(strlen(rmc.cog)*11)),90, rmc.cog, &Arial__12, 0);
    		//glcd_print2_P(112, 90, "°", &Arial__12, 0);
    
    		//glcd_print2(175,90, rmc.sog, &Arial__12, 0);
    
    	menu.do_once = 1;
    
    		switch (get_key(CLR))
    	{
    		case MENU:
    				menu.index = 60;
    				menu.do_once = 0;
    			break;
    	}
    }//screen_gps
    Hat jemand eine Idee woran das liegen kann?

    Vielen Dank!

    MfG, Marten83
    Angehängte Dateien Angehängte Dateien

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190
    So,

    habe per Zufall das Problem gefunden und auch lösen können.
    Wen es interessiert:
    strcat bzw strncat eignet sich nicht dazu einen String in ein leeres Array zu schreiben und terminieren zu lassen. (Ich sollte wohl demnächst genauer lesen)
    Habe das ganze nun per Hand terminiert, wobei man das auch mit strlcpy machen könnte. Allerdings erscheint mir das langsamer als es nachträglich per Hand zu machen.

    MfG, Marten83

Berechtigungen

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