|
|
  |
Преобразовать целое в строку, int to string |
|
|
|
Nov 8 2009, 09:38
|

embedder
  
Группа: Свой
Сообщений: 264
Регистрация: 11-05-05
Из: Казань
Пользователь №: 4 911

|
Цитата(ViKo @ Nov 8 2009, 12:24)  Не нашел в Keil функции преобразования целого числа в строку, ну, как itoa в Hi-Tech C for PIC, например. Хочу вывести код с АЦП на ЖКИ. Неужто придется самому изобретать такую тривиальную вешь? а printf("value=%u",uiNumber); не катит?
--------------------
Мечты стареют куда быстрее мечтателей… Стивен Кинг. "Ловец снов"
|
|
|
|
|
Nov 8 2009, 09:53
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(zksystem @ Nov 8 2009, 12:38)  а printf("value=%u",uiNumber); не катит? А как указать, куда "катить"? Есть отладочная плата MCBSTM32, на ней ЖКИ двухстрочный. Запустил проект Blinky, там для ЖКИ есть несколько функций Код extern void lcd_init (void); extern void lcd_clear (void); extern void lcd_putchar (char c); extern void set_cursor (int column, int line); extern void lcd_print (char *string); extern void lcd_bargraph (int value, int size); extern void lcd_bargraphXY (int pos_x, int pos_y, int value); Как мне к ним прицепить printf? Я пробовал, не получилось.
|
|
|
|
|
Nov 8 2009, 10:09
|
Частый гость
 
Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680

|
Простейшая функция: Код char* adc2str(uint_fast16_t d, char* out) { out[4] = '\0'; out[3] = '0' + ( d ) % 10; out[2] = '0' + ( d /= 10 ) % 10; out[1] = '0' + ( d /= 10 ) % 10; out[0] = '0' + ( d / 10 ) % 10; return out; } На арме должна работать быстро(у меня примерно такая выполняется за 1мкс на stm32-28Мц). Использовать примерно так: Код char str[5]; adc2str(adc_value, str); Эта функция только для 4-ёх значного числа, но легко модифицируется для любых чисел.
|
|
|
|
|
Nov 8 2009, 10:21
|
Участник

Группа: Свой
Сообщений: 43
Регистрация: 12-10-07
Пользователь №: 31 293

|
Цитата(zksystem @ Nov 8 2009, 12:38)  а printf("value=%u",uiNumber); не катит? Код sptrinf (dst, "%u", n); Код { int i, j;
/* convert number to string. */ for (i = 0;;) { dst[i++] = '0' + n % 10; n = n / 10;
if (n == 0) break; }
/* terminate string. */ dst[i] = '\0';
/* swap chars ordering. */ for (j = 0; i; ++j) { char c;
c = dst[--i]; dst[i] = dst[j]; dst[j] = c; } } p.s. Если нужен более быстрый код, без повторного обращения к буферу, то стоит предварительно логарифмировать N через бинарное дерево и заполнить буфер с конца. Также рекомендую оперцию деления заменить на "деление на константу" через умножение и сдвиги.
|
|
|
|
|
Nov 8 2009, 10:45
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
За примеры преобразования числа в строку - Спасибо! Нашел, как перенаправить printf на ЖКИ. В файле Retarget.c подменил функцию fputc Код extern void lcd_putchar(char c);
/// int fputc (int ch, FILE *f) { return (ser_putchar(ch)); } int fputc (int ch, FILE *f) { lcd_putchar((char)ch); return ch; } Теперь число выводится на индикатор Код printf("%d", AD_value); а за ним еще лезет текст "AD value =". Но это уже другой вопрос.
|
|
|
|
|
Nov 8 2009, 13:00
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
"Творчески переработав" предложенное, сотворил следующую функцию Код void NumberToString (int Number, char * StrBuf) { StrBuf[5] = '\0'; for (signed char i=4; i>=0; i--) { StrBuf[i] = '0' + Number % 10; Number /= 10; } } Ну а в программе использую просто Код char AD_Buffer[7];
NumberToString(AD_value, AD_Buffer); printf("ADC = %s", AD_Buffer); Спасибо всем откликнувшимся (кроме...)!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|