Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с внешним устройством  (Прочитано 7868 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mapiha87
Новенький

ru
Offline Offline

« : 05-10-2010 05:29 » 

Помогите пожалуйста.
Дали готовую программу по работе с железом на С++Builder6. Надо переделать для другого прибора.
Прибор выдает 8 байт 50 57 54 70 52 69 52 49 если перевести на символы  2 9 6 f 4 e 4 1
Надо преобразовать в вид 0х29 0х6f 0х4е 0х41 что соответствует числу float 12.90
Функции типа atof не подходят.
Ничего не получается. Марина.
 Скромно так...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 05-10-2010 06:00 » 

пусть буфер с данными BYTE* buffer содержит N байтов, которые должны вроде представлять float. Тогда:
Код:
float f=0;
memmove(&f, buffer, min( sizeof(f),N ) );
конечно, если порядок байтов соответствует. Если не соответствует, то нужно переставить так, как нужно
Записан

Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 05-10-2010 06:30 » 

Попробуйте такой вариант:

Код:

const char *s = "296f4e41";
union {
  int i;
  float f;
} u;

int i;
sscanf(s, "%8x", &u.i);
printf("%f", u.f);


Правда, двоичному представлению 0x296f4e41 соответствует 5.3136535e-014, а не 12.90. Уточните, пожалуйста.
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 05-10-2010 06:34 » new

на одном наборе, практически сложно разобраться и сопоставить
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
darkelf
Молодой специалист

no
Offline Offline

« Ответ #4 : 05-10-2010 06:43 » 

Код:
#include <stdio.h>

char buff[8] = {50, 57, 54, 70, 52, 69, 52, 49};

#define conv(a) ((((a) >= '0') && ((a) <= '9')) ? ((a) - '0') : \
                ((((a) >= 'a') && ((a) <= 'f')) ? ((a) - 0x57) : \
                ((((a) >= 'A') && ((a) <= 'F')) ? ((a) - 0x37) : -1)))

int main(int argc, char* argv[])
{ union
  { char rbuff[4];
    float f;
  } u;

  u.rbuff[0] = (conv(buff[0]) << 4) | conv(buff[1]);
  u.rbuff[1] = (conv(buff[2]) << 4) | conv(buff[3]);
  u.rbuff[2] = (conv(buff[4]) << 4) | conv(buff[5]);
  u.rbuff[3] = (conv(buff[6]) << 4) | conv(buff[7]);

  printf("%f\n", u.f);

  return 0;
}

Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 05-10-2010 06:45 » 

Понял, тут еще и байты в обратном порядке идут. 0x414e6f29 = 12.902139

Придется менять порядок.
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 05-10-2010 06:47 » 

darkelf, лучше твой вариант заменить на описание полей Улыбаюсь Работать будет быстрее, да и глазу приятнее
Записан

Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 05-10-2010 06:51 » 

Вариант с учетом инверсного порядка байт:

Код:
const char *s = "296f4e41";
union {
  unsigned char c[4];
  float f;
} u;

sscanf(s, "%2x%2x%2x%2x", &u.c[0], &u.c[1], &u.c[2], &u.c[3]);
printf("%f", u.f);

Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Mapiha87
Новенький

ru
Offline Offline

« Ответ #8 : 06-10-2010 06:35 » 

Спасибо Dale
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines