PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : T6963C Stringproblem [gelöst]



Marten83
25.10.2009, 09:20
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:

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

Marten83
28.10.2009, 17:11
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