Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как перевести число в строку и обратное преобразо, 5348464848 в 50.00  
V
    Опции темы
debil
Дата 29.1.2008, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 12.12.2007

Репутация: нет
Всего: нет



Железо выдает байты 53 48 46 48 48. Как преобразуя в строку вывести в Label 50.00
Плдсчитав контрольную сумму равную 50730 мне надо жележяке передать 53 48 55 51 48.
Как правильно преобразовать.

PM MAIL   Вверх
JackYF
Дата 29.1.2008, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 4
Всего: 162



debil, ничего не понял.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
mrbrooks
Дата 29.1.2008, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Мда. Очень сложно понять что ты хочешь. судя по всему ты опрашиваеш какой то девайс по com-порту. Тебе в первую очередь необходимо твой буфер преобразовать в число а затем уже в строку. Но в какой тип значения? Судя по всему во float. Для этих целей преобразуй имеющийся буфер в число при помощи memcopy(). Естественно не забывай что во float 4 байта.
PM MAIL   Вверх
dumb
Дата 30.1.2008, 02:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



Цитата(debil @  29.1.2008,  18:08 Найти цитируемый пост)
Железо выдает байты 53 48 46 48 48. Как преобразуя в строку вывести в Label 50.00

smile железо выдает готовую строку. dec: 53 48 46 48 48 = hex: 35 30 2E 30 30 = "50.00"
а контрольную сумму переводим в строку(itoa итп) и суем в железяку.
PM MAIL   Вверх
EugenOS
Дата 31.1.2008, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 21.11.2007

Репутация: нет
Всего: нет



Цитата

Железо выдает байты 53 48 46 48 48. Как преобразуя в строку вывести в Label 50.00
Плдсчитав контрольную сумму равную 50730 мне надо жележяке передать 53 48 55 51 48.
Как правильно преобразовать.


Пусть в char* buf у нас принятая строка. А в int length - ее длина
А int crc - контрольная сумма.


Тогда:
Код

 Label1->Caption = AnsiString( buf, length ); // Хотя в принципе можно было просто присвоить. Но так будет надежнее
// ... здесь вычисляем контрольную сумму и заносим ее в crc
 AnsiString result = AnsiString( crc );
sendBytesToHardware( result.c_str(), result.Length() ); // вместо .c_str() в данном случае уместнее  .data(), но привычка берет свое ;)

PM MAIL   Вверх
debil
Дата 5.2.2008, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 12.12.2007

Репутация: нет
Всего: нет



Спасибо всем кто помог! smile 
Код

char Buf_Otvet[25];


float IRT_Data;
int  IRT_N;
int Zaptos_IRT;


Buf_Otvet[] = {33,49,49,59,53,55,46,53,56,56,59,50,51,52,55,13, ………};
где 33 – начало посылки ответа, при подсчете контрольной суммы не учитывается,
      13 – конец посылки,
       59- разделительные байты,
      49,49 -> № прибора от1 до 254 ( 1-3 байта)
      53,55,46,53,56,56 -> 57.588 (физическая величина технологического процесса) от 4 до 7 байт бывает,
      50,51,52,55 –контрольная сумма ( 4 - 5 байт)


char *tr = "00000"; 
char *Data_IRT = "1234567890abcdef"; 
 int b59_1, b59_2;


IRT_Data = 77.77; // может и не надо

Подсчитываю длину посылки, сколько байт занимает № ИРТ (b59_1) и физич. величина(b59_2), далее преобразую и вывожу на экран и в файл для архивации:

if(b59_1 < 3)
           {  //  ИРТ № 1-99
              tr[0] = Buf_Otvet[1] ;
              tr[1] = Buf_Otvet[2] ;
              if(b59_1 == 2)
 tr[2] = Buf_Otvet[3] ;   // может и не надо
              IRT_N = atoi(tr);
           }
           else
             { // ИРТ № 100-254
              tr[0] = Buf_Otvet[1] ;
              tr[1] = Buf_Otvet[2] ;
              tr[2] = Buf_Otvet[3] ;
              tr[3] = Buf_Otvet[4] ;
              [U]IRT_N = atoi(tr);   [/U]
             }  
if(b59_2 > 3)
              { // пришли данные               
                 Data_IRT[0] = Buf_Otvet[i+b59_1+1] ;
                 Data_IRT[1] = Buf_Otvet[i+b59_1+2] ;
                 Data_IRT[2] = Buf_Otvet[i+b59_1+3] ;
                 Data_IRT[3] = Buf_Otvet[i+b59_1+4] ;
                 Data_IRT[4] = Buf_Otvet[i+b59_1+5] ;
                 Data_IRT[5] = Buf_Otvet[i+b59_1+6] ;
                 Data_IRT[6] = Buf_Otvet[i+b59_1+7] ;
                 Data_IRT[7] = Buf_Otvet[i+b59_1+8] ;
                 Data_IRT[8] = Buf_Otvet[i+b59_1+9] ;

                 IRT_Data = atof(Data_IRT);
                 
                 StatusBar1 -> Panels -> Items[3] -> Text  = "ИРТ №" + IntToStr(IRT_N);

                 Label1 ->  Caption = FloatToStrF(IRT_Data, ffFixed, 8, 3); //-- для примера
………………………………….
              }

Отправка данных в ИРТ т.е. запрос на передачу данных

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{

Byte Read_IRT1[]     = {58, 00,        59, 49, 59, 48, 59, 00, 00, 00, 00, 00, 13}; // ИРТ №  < 10
Byte Read_IRT11[]   = {58, 00, 00,  59, 49, 59, 48, 59, 00, 00, 00, 00, 00, 13}; // ИРТ № 10-99
// Byte Read_IRT111[]  = {58, 00, 00, 00, 59, 49, 59, 48, 59, 00, 00, 00, 00, 00, 13}; 
// 00- переменные байты
char KS_string[9] ;

  Timer1 -> Interval = 500;
  
  Zaptos_IRT ++;

if(Zaptos_IRT > 32)    Zaptos_IRT = 1; //. в сети  может быть подключено до 
                                                                 // 32 приборов  по RS-485 протоколу

if(Zaptos_IRT < 10)
   {  

    itoa(Zaptos_IRT, KS_string, 10);

    Read_IRT1[1]  = KS_string[0];
    KS = 0;
    KS = GetCtrSum(Read_IRT1, 6); // подсчитать КС

   itoa(KS, KS_string, 10);
    Read_IRT1[7]= KS_string[0];
    Read_IRT1[8]= KS_string[1];
    Read_IRT1[9]= KS_string[2];
    Read_IRT1[10]= KS_string[3];
    Read_IRT1[11]= KS_string[4];
    MessageForIRT((LPCVOID)Read_IRT1, sizeof(Read_IRT1), Sender);
………………………
// прием и сортировка
   }
if(Zaptos_IRT > 9)
   {

    itoa(Zaptos_IRT, KS_string, 10);

    Read_IRT11[1]  = KS_string[0];
    Read_IRT11[2]  = KS_string[1];

    KS = 0;
    KS = GetCtrSum(Read_IRT11, 7); // подсчитать КС

    itoa(KS, KS_string, 10);

    Read_IRT11[8]= KS_string[0];
    Read_IRT11[9]= KS_string[1];
    Read_IRT11[10]= KS_string[2];
    Read_IRT11[11]= KS_string[3];
    Read_IRT11[12]= KS_string[4];
    MessageForIRT((LPCVOID)Read_IRT11, sizeof(Read_IRT11), Sender);
………………………
// прием и сортировка

   }
………………………………..

// Не стал корячиться  с одним массивом, работает и ладно.  

}


 smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0705 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.