Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
03/03/10 07:06
Modified:
  03/03/10 07:06

Read: times


 
#173759 - Problem with strings in C
Hi,

I have written code for reading time from DS1307 RTC, convert BCD to decimal (12:34:56 in BCD to 12:34:56 in dec) & then that decimal to an ASCII string & after that copy the individual strings ("12" "34" "56") to a str_buffer with proper formatting e.g. "12:34:56 PM". Finally I send this str_buffer to a graphical LCD.
The way I am doing this is:

static unsigned char xdata str_buffer[20]; //not sure if static reqd, its in main()
...
strcpy(str_buffer,dec2ascii(read_hour())); //read_hour() returns 12 in dec (tested)
strcat(str_buffer,":"); 
strcat(str_buffer,dec2ascii(read_min()));  //dec2ascii() returns ptr to "34"
strcat(str_buffer,":");
strcat(str_buffer,dec2ascii(read_sec()));
LCD_sendstring(str_buffer);
 

Now the problem I am facing is that as soon as LCD_sendstring(str_buffer) is called, everyting else disappears from LCD! even though the Keil debugger shows "12" being copied/concatenated to str_buffer on using strcpy/strcat(str_buffer,dec2ascii(12));

while the following code works:
 strcpy(str_buffer,"11"));
 strcat(str_buffer,":"); 
 strcat(str_buffer,"22");
 strcat(str_buffer,":");
 strcat(str_buffer,"33");
 LCD_sendstring(str_buffer);
 
& prints 11:22:33 on LCD.
On dubugging yet another test code:
strcpy(str_buffer,dec2ascii(11));
strcat(str_buffer,":"); 
strcat(str_buffer,dec2ascii(22));
strcat(str_buffer,":");
strcat(str_buffer,dec2ascii(33));
LCD_sendstring(str_buffer);
 
I found that "11:22:33" is passed to LCD_sendstring() but still disappearing on LCD!

Here is my dec2ascii() (it's in another file containing DS1307 subroutines)
/*------------------------------------------------------------------------
	Converts 2 digit decimal to ACSII string...	26 to "26"
	returns pointer to converted string i.e 2  
--------------------------------------------------------------------------*/
unsigned char* dec2ascii (unsigned char dec)
{
code unsigned char asciitable[10]={'0','1','2','3','4','5','6','7','8','9'}; //look up table for ascii values
static unsigned char buffer[2];	//to hold the 2 ascii codes ... MUST be static

buffer[0]=asciitable[(dec-dec%10)/10];	//tens
buffer[1]=asciitable[dec%10];		//ones
return buffer;
}
 

my typical tested & working routines to read from RTC:
unsigned char read_hour(void)
{ unsigned char temp;
 temp = readbyte(HR_RTC);
 if(temp & (1<<6))			//12 hr mode is selected if set
 return(bcd2dec(temp & ~(1<<6) & ~(1<<5)));	//strip the 6th & 5th bits: AM/PM & 12hr/24hr mode & convert the remaining
 else
 return(bcd2dec(temp));
}
unsigned char read_min(void)
{ return(bcd2dec(readbyte(MIN_RTC)));
}
unsigned char read_sec(void)
{ return(bcd2dec(readbyte(SEC_RTC)));
}
 

What could be wrong with my code?

List of 35 messages in thread
TopicAuthorDate
Problem with strings in C            01/01/70 00:00      
   You missed a fundamental point on how 'C' does strings            01/01/70 00:00      
      I think you don't need to be mysterious here, Andy            01/01/70 00:00      
         Strings in 'C' *must* be NUL-terminated            01/01/70 00:00      
   A little whitespace goes a long way            01/01/70 00:00      
   conversion on top of conversion            01/01/70 00:00      
      Null termination            01/01/70 00:00      
         Think about it...            01/01/70 00:00      
         so is your problem solved or not?            01/01/70 00:00      
            "lucky" or "unlucky"?            01/01/70 00:00      
               rather            01/01/70 00:00      
                  Yes - that's what I meant!            01/01/70 00:00      
            That, in fact, IS it            01/01/70 00:00      
               how true            01/01/70 00:00      
               Debugger != Simulator            01/01/70 00:00      
               if that is true, find another job!            01/01/70 00:00      
                  Does Keil initialise non-static data?            01/01/70 00:00      
                     the very first thing ...            01/01/70 00:00      
                        this is not the case..            01/01/70 00:00      
                           Mr C hater:            01/01/70 00:00      
                              this IS part of the C-hatred            01/01/70 00:00      
                                 but you do            01/01/70 00:00      
                                    and what are the unzeroed values, then?            01/01/70 00:00      
                                       I have no idea            01/01/70 00:00      
                                    Many Reasons for not clearing (all of) RAM            01/01/70 00:00      
                                       I actually gave an example.            01/01/70 00:00      
                                       Another Example...            01/01/70 00:00      
                                          what I wold do            01/01/70 00:00      
                                             I Elect to Totally Disagree            01/01/70 00:00      
                                                a reply            01/01/70 00:00      
                                                   I'll take the time to reply when...            01/01/70 00:00      
                                                   It's too easy            01/01/70 00:00      
                                                      Auro variables are always undefined            01/01/70 00:00      
                                                Seconded!            01/01/70 00:00      
                                                   makes assumptions?            01/01/70 00:00      

Back to Subject List