Форум программистов «Весельчак У»
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
Начало
Наши сайты
Галерея
Весельчак У
Наша Вики
Хранилище
Проекты
Правила
Правила форума
Правила русского языка
Помощь
Поиск
Календарь
Почта
Войти
Регистрация
Форум программистов «Весельчак У»
>
Программирование
>
C/C++
(Модератор:
Вад
) > Тема:
Работа с внешним устройством
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Работа с внешним устройством (Прочитано 8561 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mapiha87
Новенький
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 не подходят.
Ничего не получается. Марина.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
Re: Работа с внешним устройством
«
Ответ #1 :
05-10-2010 06:00 »
пусть буфер с данными BYTE* buffer содержит N байтов, которые должны вроде представлять float. Тогда:
Код:
float f=0;
memmove(&f, buffer, min( sizeof(f),N ) );
конечно, если порядок байтов соответствует. Если не соответствует, то нужно переставить так, как нужно
Записан
>FAQ ПО ПРОГР.
>ССЫЛКИ ПО ПРОГР.
>Правила"Неотложки"
Dale
Блюзмен
Команда клуба
Offline
Пол:
Re: Работа с внешним устройством
«
Ответ #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
Команда клуба
Offline
Пол:
Re: Работа с внешним устройством
«
Ответ #3 :
05-10-2010 06:34 »
на одном наборе, практически сложно разобраться и сопоставить
Записан
Мы все учились понемногу... Чему-нибудь и как-нибудь.
darkelf
Молодой специалист
Offline
Re: Работа с внешним устройством
«
Ответ #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
Блюзмен
Команда клуба
Offline
Пол:
Re: Работа с внешним устройством
«
Ответ #5 :
05-10-2010 06:45 »
Понял, тут еще и байты в обратном порядке идут. 0x414e6f29 = 12.902139
Придется менять порядок.
Записан
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
Re: Работа с внешним устройством
«
Ответ #6 :
05-10-2010 06:47 »
darkelf
, лучше твой вариант заменить на описание полей
Работать будет быстрее, да и глазу приятнее
Записан
>FAQ ПО ПРОГР.
>ССЫЛКИ ПО ПРОГР.
>Правила"Неотложки"
Dale
Блюзмен
Команда клуба
Offline
Пол:
Re: Работа с внешним устройством
«
Ответ #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
Новенький
Offline
Re: Работа с внешним устройством
«
Ответ #8 :
06-10-2010 06:35 »
Спасибо Dale
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Форум программистов «Весельчак У»
>
Программирование
>
C/C++
(Модератор:
Вад
) > Тема:
Работа с внешним устройством
Загружается...