Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Как перевести число в строку и обратное преобразо


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

Автор: JackYF 29.1.2008, 20:09
debil, ничего не понял.

Автор: mrbrooks 29.1.2008, 21:13
Мда. Очень сложно понять что ты хочешь. судя по всему ты опрашиваеш какой то девайс по com-порту. Тебе в первую очередь необходимо твой буфер преобразовать в число а затем уже в строку. Но в какой тип значения? Судя по всему во float. Для этих целей преобразуй имеющийся буфер в число при помощи memcopy(). Естественно не забывай что во float 4 байта.

Автор: dumb 30.1.2008, 02:00
Цитата(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 итп) и суем в железяку.

Автор: EugenOS 31.1.2008, 20:26
Цитата

Железо выдает байты 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(), но привычка берет свое ;)

Автор: debil 5.2.2008, 18:58
Спасибо всем кто помог! 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 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)