|
winavr & sprintf |
|
|
|
Oct 17 2008, 18:38
|
Частый гость
 
Группа: Свой
Сообщений: 130
Регистрация: 30-07-08
Из: Moscow
Пользователь №: 39 302

|
Не получается преобразовать char в string но в шестнадцатеричной системе. Цель: выплюнуть в usart серийник ds1990 в шестнадцатеричном виде, делаю для примера так: Код #include <stdio.h> char idd2; sprintf(idd2,"%02X",10); Но в idd2 нет 0C, что я делаю не так? Компилятор AVRstudio 4.12 + WinAVR-20050214, тело mega16+8мгц кварц. P.S. Немного терпения плс, так как рабтаю с контролерами не давно, avr-libc-user-manual-1.2.3.pdf читал, форум поиском пробегал......
|
|
|
|
|
 |
Ответов
|
Oct 19 2008, 17:29
|
Частый гость
 
Группа: Свой
Сообщений: 130
Регистрация: 30-07-08
Из: Moscow
Пользователь №: 39 302

|
Не получается, делаю так: Код #include <stdio.h> char idd1[8]; char idd2[8];
ReadKey(idd1,2); //в idd1 серийник таблетки (8 байт) sprintf(idd2,"%02X",(int)idd1); USART_Send_srt(idd2); //выводим в USART idd2 В терминале выводит число "13A", хотя в idd1 всего 8 байт, почему так???? P.S. Просьба помочь советом, а не посылать к учебнику.
|
|
|
|
|
Oct 20 2008, 01:05
|

Местный
  
Группа: Свой
Сообщений: 234
Регистрация: 28-02-06
Из: Иркутск
Пользователь №: 14 771

|
Цитата(TechMike @ Oct 19 2008, 20:29)  Не получается, делаю так: Код #include <stdio.h> char idd1[8]; char idd2[8];
ReadKey(idd1,2); //в idd1 серийник таблетки (8 байт) sprintf(idd2,"%02X",(int)idd1); USART_Send_srt(idd2); //выводим в USART idd2 В терминале выводит число "13A", хотя в idd1 всего 8 байт, почему так???? P.S. Просьба помочь советом, а не посылать к учебнику. Во-первых внимательно читайте что Вам пишут. Если нужно вывести 8 байт, то не забываем про \0 в конце. printf именно по нему определяет что пора остановиться. Второе, зачем каставали к int ? У вас передано название массива - что воспрнимается как указатель, а Вы еше кастанули к int. Компилер сишный использует двухбайтовые указатели даже для 8-и битной платформы. Вот и вывелось двухбайтное число (0х13А). Третье, у Вас массив из hex-ов. Я может не прав (в плане вывода массива - можно использовать цикл и конкатенацию) но попробуйте сделать так - самый быстрый способ проверки: Код char *str[9]; unsigned char idd2[8]; sprintf(str, "%02X%02X%02X%02X%02X%02X%02X%02X", idd2[0], idd2[1], idd2[2], idd2[3], idd[4], idd2[5], idd2[6], idd2[7]); USART_Send_srt(*str); //выводим в USART idd2 Почитайте, что есть указатель, что есть строка. Чем массив char'ов отличается от стринга. Форматирование. Преобразование типов. Работу с указателями. Программит станет намного проще. И выкиньте CV AVR. У него си очень далек от стандартного. Потому собирать кочки будете сами и расхлебывать тоже.
Сообщение отредактировал MTh - Oct 20 2008, 01:10
|
|
|
|
|
Oct 20 2008, 16:18
|
Частый гость
 
Группа: Свой
Сообщений: 130
Регистрация: 30-07-08
Из: Moscow
Пользователь №: 39 302

|
Цитата(MTh @ Oct 20 2008, 05:05)  Во-первых внимательно читайте что Вам пишут. Если нужно вывести 8 байт, то не забываем про \0 в конце. printf именно по нему определяет что пора остановиться. Второе, зачем каставали к int ? У вас передано название массива - что воспрнимается как указатель, а Вы еше кастанули к int. Компилер сишный использует двухбайтовые указатели даже для 8-и битной платформы. Вот и вывелось двухбайтное число (0х13А). Третье, у Вас массив из hex-ов. Я может не прав (в плане вывода массива - можно использовать цикл и конкатенацию) но попробуйте сделать так - самый быстрый способ проверки: Код char *str[9]; unsigned char idd2[8]; sprintf(str, "%02X%02X%02X%02X%02X%02X%02X%02X", idd2[0], idd2[1], idd2[2], idd2[3], idd[4], idd2[5], idd2[6], idd2[7]); USART_Send_srt(*str); //выводим в USART idd2 Почитайте, что есть указатель, что есть строка. Чем массив char'ов отличается от стринга. Форматирование. Преобразование типов. Работу с указателями. Программит станет намного проще. И выкиньте CV AVR. У него си очень далек от стандартного. Потому собирать кочки будете сами и расхлебывать тоже. Со всем Вами названым ознакомился. Респект Вам, все получилось, спасибо за терпение. Код #include <stdio.h> char idd1[8]; char idd2[9]; ReadKey(idd1,2); sprintf(idd2, "%02X%02X%02X%02X%02X%02X%02X%02X", idd1[0], idd1[1], idd1[2], idd1[3], idd1[4], idd1[5], idd1[6], idd1[7]); USART_Send_srt(idd2); //выводим в шестнадцатеричном виде серийник ds1990
|
|
|
|
Сообщений в этой теме
TechMike winavr & sprintf Oct 17 2008, 18:38 Nick_Shl Цитата(TechMike @ Oct 17 2008, 21:38) Не ... Oct 17 2008, 19:29 Сергей Борщ Цитата(Nick_Shl @ Oct 17 2008, 22:29) Код... Oct 18 2008, 10:56  demiurg_spb А ещё есть замечательные функции itoa и utoa.
См. ... Oct 18 2008, 19:14  zltigo Цитата(Сергей Борщ @ Oct 18 2008, 12:56) ... Oct 18 2008, 23:04 Aleksandr Baranov Я бы использовал snprintf, чтобы никогда не залезт... Oct 17 2008, 21:01 ReAl Цитата(TechMike @ Oct 17 2008, 21:38) Не ... Oct 17 2008, 22:11 TechMike Изначально серийник ds1990 получаю в виде массива ... Oct 18 2008, 21:17 sergeeff Цитата(TechMike @ Oct 19 2008, 21:29) Не ... Oct 19 2008, 18:04 MTh Пожалуйста.
Рад что все получилось. Oct 23 2008, 00:46
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|