|
|
View previous topic :: View next topic |
Author |
Message |
Kookoo Guest
|
Convert a char string to hex |
Posted: Tue Jan 17, 2006 11:40 am |
|
|
Hello,
is there any function to convert a char string of 2 characters for example : char test[1]
to an hexadecimal number : byte hex ?
Many Thanks. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Jan 17, 2006 12:46 pm |
|
|
Here's how to find the answer:
Look at the chart of built-in functions on page 98 (in the Acrobat reader)
of the CCS manual. It has a list of standard string handling or
character handling functions. At the top of the chart, it lists functions
such as atoi, atol, etc. These mean "ASCII to integer", etc.
The source code for these functions is in stdlib.h, which is in this folder:
c:\Program Files\PICC\Drivers
If you think those functions have too much code, there are truncated
versions posted in various places on the forum:
http://www.ccsinfo.com/forum/viewtopic.php?t=17563&highlight=adtol |
|
|
mdares
Joined: 26 Oct 2005 Posts: 19
|
|
Posted: Tue Jan 17, 2006 1:55 pm |
|
|
You can just cast a character to it's ascii value using (int), but you didn't look very hard if your asking this question.
Mattd |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Jan 17, 2006 2:24 pm |
|
|
If he has an array of two characters, such as "15", the array consists
of two ASCII bytes, 0x31 and 0x35.
I assume he wants to convert that number to an integer: 0x0F
You can't do that by casting. |
|
|
newguy
Joined: 24 Jun 2004 Posts: 1909
|
|
Posted: Tue Jan 17, 2006 2:42 pm |
|
|
I do this with something I built. I have to download hex codes to an on-board I2C EEPROM via RS232.
Unless you convert lowercase ascii letters (a-f) to uppercase before you do this conversion, it will fail. I simply make sure the caps lock key is on before I do my downloads.
I use this function with a interrupt-driven serial receive routine, very similar to what has been posted on this board dozens of times.
All the code does is search through the received data buffer and converts the ascii digits 0-9 and a-f into their hex equivalents, 0 - 15. It then does a second pass through the data, taking pairs of characters and combining them into one 8 bit value. You should be able to follow it.
Code: | void decode_data(void) {
int16 write_address = 0;
int8 data[40], i;
int1 internal = FALSE;
// data string standard format:
// $ - command start
// A - address, 4 characters, each representing a hex number
// if first character of address = 'I', then data must be written to internal
// EEPROM, starting at address 0
// D - data, up to 8 characters, each representing a hex number
// End$ - end string, initiates eeprom save, echoes acknowledgement, restores A/D function
// do validity check first
if (rx_buffer[0] != 'A' || (data_length % 2 != 0)) {
bputc(0x0d); // cr
bputc(0x0a); // lf
bputc("Invalid command");
bputc(0x0d); // cr
bputc(0x0a); // lf
}
else if (rx_buffer[5] == 'D') { // write
bputc(0x0d); // cr
bputc(0x0a); // lf
bputc("Understood - data write");
bputc(0x0d); // cr
bputc(0x0a); // lf
// assemble address
for (i = 1; i < 5; i++) {
if (rx_buffer[i] == 'I') { // do internal write
internal = TRUE;
i = 5;
}
else if (rx_buffer[i] > 0x39) {
rx_buffer[i] = rx_buffer[i] - 0x37;
}
else {
rx_buffer[i] = rx_buffer[i] - 0x30;
}
}
write_address = rx_buffer[4] + (0x10 * rx_buffer[3]) + (0x100 * rx_buffer[2]) + (0x1000 * rx_buffer[1]);
printf(bputc,"Address = %lx",write_address);
bputc(0x0d); // cr
bputc(0x0a); // lf
for (i = 6; i < (6 + data_length); i++) {
if (rx_buffer[i] > 0x39) {
rx_buffer[i] = rx_buffer[i] - 0x37;
}
else {
rx_buffer[i] = rx_buffer[i] - 0x30;
}
}
data_length = data_length / 2;
for (i = 0; i < data_length; i++) {
data[i] = 0x10 * rx_buffer[6 + (2*i)];
data[i] = data[i] + rx_buffer[7 + (2*i)];
if (!internal) {
write_one_byte(write_address + i, data[i]);
}
else {
write_eeprom(i, data[i]);
delay_ms(15);
}
}
}
else if (rx_buffer[5] == 'R') { // read from address
bputc(0x0d); // cr
bputc(0x0a); // lf
bputc("Understood - data read");
bputc(0x0d); // cr
bputc(0x0a); // lf
// assemble address
for (i = 1; i < 5; i++) {
if (rx_buffer[i] == 'I') { // do internal write
internal = TRUE;
i = 5;
}
else if (rx_buffer[i] > 0x39) {
rx_buffer[i] = rx_buffer[i] - 0x37;
}
else {
rx_buffer[i] = rx_buffer[i] - 0x30;
}
}
write_address = rx_buffer[4] + (0x10 * rx_buffer[3]) + (0x100 * rx_buffer[2]) + (0x1000 * rx_buffer[1]);
printf(bputc,"Address = %lx",write_address);
bputc(0x0d); // cr
bputc(0x0a); // lf
if (internal) {
for (i = 0; i < 16; i++) {
bputc(read_eeprom(i));
}
}
else {
bputc(load_data_from_address(write_address));
for (i = 0; i < 63; i++) {
bputc(load_data_no_address());
}
}
}
} |
|
|
|
mdares
Joined: 26 Oct 2005 Posts: 19
|
|
Posted: Tue Jan 17, 2006 2:54 pm |
|
|
I see, I think your right PCM, I was going on he char test[1] as what he wants to 'convert'. eg
for i = 1 to n {
some_int[i] = (int) some_char[i]
} |
|
|
Kookoo Guest
|
|
Posted: Wed Jan 18, 2006 4:00 am |
|
|
Hello,
i have to get the date and time for example :
char year[2];
char month[2];
char date[2];
printf("\n\rYear : ");
gets(year);
printf("\n\rMonth : ");
gets(month);
printf("\n\rDate : ");
gets(date);
For example, if i put :
06
01
18
I will have :
year[0] => 0
year[1] => 6
month[0] => 0
month[1] => 1
date[0] = > 1
date[1] = > 8
I have a real time clock that i want to initialize with this function :
RTC_set_datetime(date, month, year, hour, min, sec);
But this function take bytes in parameters, and i have char strings.
It should be like this :
RTC_set_datetime(18, 01, 06, 10, 58, 00);
for 2006/01/18 10:58:00
How can i do this ?
Thanks ! |
|
|
Kookoo Guest
|
|
Posted: Wed Jan 18, 2006 6:36 am |
|
|
I used atoi function with something pretty much like this :
year= atoi(year_char, 16);
It works very well.
Thanks a lot. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|