реклама на сайте
подробности

 
 
 
Closed TopicStart new topic
> Преобразовать целое в строку, int to string
ViKo
сообщение Nov 8 2009, 09:24
Сообщение #1


Универсальный солдатик
******

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



Не нашел в Keil функции преобразования целого числа в строку, ну, как itoa в Hi-Tech C for PIC, например. Хочу вывести код с АЦП на ЖКИ. Неужто придется самому изобретать такую тривиальную вешь?
Go to the top of the page
 
+Quote Post
zksystem
сообщение Nov 8 2009, 09:38
Сообщение #2


embedder
***

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



Цитата(ViKo @ Nov 8 2009, 12:24) *
Не нашел в Keil функции преобразования целого числа в строку, ну, как itoa в Hi-Tech C for PIC, например. Хочу вывести код с АЦП на ЖКИ. Неужто придется самому изобретать такую тривиальную вешь?

а printf("value=%u",uiNumber); не катит?


--------------------
Мечты стареют куда быстрее мечтателей… Стивен Кинг. "Ловец снов"
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 8 2009, 09:53
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 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? Я пробовал, не получилось.
Go to the top of the page
 
+Quote Post
baralgin
сообщение Nov 8 2009, 10:09
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 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-ёх значного числа, но легко модифицируется для любых чисел.
Go to the top of the page
 
+Quote Post
Ivan_Petrov
сообщение Nov 8 2009, 10:21
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 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 через бинарное дерево и заполнить буфер с конца. Также рекомендую оперцию деления заменить на "деление на константу" через умножение и сдвиги.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 8 2009, 10:45
Сообщение #6


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 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 =". Но это уже другой вопрос.
Go to the top of the page
 
+Quote Post
IgorMarx
сообщение Nov 8 2009, 11:18
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 61
Регистрация: 5-10-05
Из: Зеленоград
Пользователь №: 9 268



Батенька, вам учить язык C нужно smile.gif, а не на форумах такие вопросы спрашивать. Пардон за банальный совет )
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 8 2009, 13:00
Сообщение #8


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 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);

Спасибо всем откликнувшимся (кроме...)!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 8 2009, 13:17
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Moderator:
Тема избита до невозможности http://www.google.lv/search?client=opera&a...-8&oe=utf-8 Автору настоятельная рекомендация прежде чем мусорить - пользоваться поиском.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Nov 8 2009, 13:18
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Да блин, спасибо за сокровенные знания! А то мы бы так в серости и остались пребывать.
Go to the top of the page
 
+Quote Post

Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 16:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01424 секунд с 7
ELECTRONIX ©2004-2016