Вернуться   Форум программистов > Форум Программирование > Форум C++ > Форум C++ Builder

C++ Builder

Программирование с использованием C++ Builder.

Ответ
 
Старый 17.02.2009, 23:14   #1
Юрчик
Новичок
 
Регистрация: 05.12.2002
Сообщений: 7
Юрчик пока не определено
По умолчанию записать в железку значение float но тремя байтами.

Есть железяка. Необходимо записать в неё, значение float но тремя байтами.
Разработчики выслали пример только на чтение:
Цитата:
void unpackFloat24(unsigned char* data, size_t dataSize, float* value)
{
unsigned long t;
assert(data);
assert(dataSize == 3);
assert(value);
t = 0;
memcpy (&t, data, 3);
*(unsigned long*)value = ntohl(t);
}
/*
void unpackFloat24(unsigned char* data, size_t dataSize, float* value)
{
unsigned char* p = (unsigned char*)(value);
assert(data);
assert(dataSize == 3);
assert(value);
p[0] = 0;
p[1] = data[2];
p[2] = data[1];
p[3] = data[0];
}
*/
Я програмлю в Builder С++, данные считываю, все работает.
Пробовал написать функцию сам, например надо передать в железку число 215.5. В пакете должно передаваться 0x18 0x6B 0x00.
Пробовал по разному, другие числа и все.
// Byte Komanda[] = {0x7F, 0x00, 0x09, 0x00, 0x00, 0x01, 0x01, 21, 0x00, 3, 0x00, 0x00, 0x00, 0x00, 0xCC};
void packFloat24(void)
{
float QW = StrToFloat(Edit_d1 -> Text);
Komanda[10] = (Byte)QW[2];
Komanda[11] = (Byte)QW[1];
Komanda[12] = (Byte)QW)[0];
}
Помогите написать void packFloat24 по аналогии с unpackFloat24
Юрчик вне форума  
Старый 22.02.2009, 18:15   #2
palva
Местный
 
Регистрация: 31.03.2001
Сообщений: 1,467
palva пока не определено
По умолчанию RE: записать в железку значение float но тремя байтами.

Komanda[10] = (Byte)QW[3];

Komanda[11] = (Byte)QW[2];

Komanda[12] = (Byte)QW[1];


palva вне форума  
Старый 24.02.2009, 22:13   #3
Юрчик
Новичок
 
Регистрация: 05.12.2002
Сообщений: 7
Юрчик пока не определено
По умолчанию RE: записать в железку значение float но тремя байтами.

Спасибо за ответ
Разработчики писали</P><DIR><DIR><DIR><DIR><DIR><DIR><DIR><B><FONT face="Arial CYR" size=2><FONT face="Arial CYR" size=2>
Формат числа с плавающей точкой</P></DIR></DIR></DIR></DIR></DIR></DIR></DIR></B>
Формат числа с плавающей точкой - это просто стандартное 4-байтовое плавающее число в IEEE-формате, или усеченное 3-х байтовое (PIC-формат) - то же, что и IEEE, но с отброшенным младшим байтом мантиссы. Если известно, что формат плавающий, то усеченный и полный IEEE-форматы можно различить по битам размера информационного поля. Внутренние поля представлены только в двоичном, но не в двоично-десятичном виде. </P><FONT face="Arial CYR" color=#0000ff size=2><FONT face="Arial CYR" color=#0000ff size=2><FONT face="Arial CYR" color=#0000ff size=2>
<STRONG>Мои потуги</STRONG>
<STRONG>
Цитата:
</STRONG>
<FONT size=2><STRONG>union</STRONG>
<STRONG>{</STRONG>
<STRONG>unsigned char c[4];</STRONG>
<STRONG>// Byte c[4];</STRONG>
<STRONG>float cou;</STRONG>
<STRONG>} cnt;</STRONG>
<STRONG>cnt.cou = StrToFloat(Edit1 -> Text);</STRONG>
<STRONG>Label38 -> Caption = IntToHex(cnt.c[0], 2);</STRONG>
<STRONG>Label39 -> Caption = IntToHex(cnt.c[1], 2);</STRONG>
<STRONG>Label40 -> Caption = IntToHex(cnt.c[2], 2);</STRONG>
<STRONG>Label41 -> Caption = IntToHex(cnt.c[3], 2);</STRONG>
<STRONG>
</STRONG></P><FONT size=2>
<STRONG>(unsigned char c[4] и Byte c[4] работают одинаково)</STRONG>
<STRONG>У прибора при передачи 215.5 = 0x18 - 0x6B - 0x00 </STRONG><FONT color=#ff0000 size=2><FONT color=#ff0000 size=2><STRONG>у меня 0x00 - 0x80 - 0x57 - 0x43</STRONG></P><FONT size=2>
<STRONG>У прибора при передачи 215.0 = 0x00 - 0xD7 - 0x00 </STRONG><FONT color=#ff0000 size=2><FONT color=#ff0000 size=2><STRONG>у меня 0x00 - 0x00 - 0x57 - 0x43</STRONG></P><FONT size=2>
<STRONG>Или используя функцию</STRONG>
<STRONG>
Цитата:
</STRONG></P><FONT size=2>
<STRONG>void Float24(unsigned char* data, float* value)</STRONG>
<STRONG>{</STRONG>
<STRONG>unsigned char* p = (unsigned char*)(value);</STRONG>
<STRONG>data[2]=p[1];</STRONG>
<STRONG>data[1]=p[2];</STRONG>
<STRONG>data[0]=p[3];</STRONG>
<STRONG>}</STRONG>
<STRONG>value = StrToFloat(Edit1 -> Text);</STRONG>
<STRONG>Float24(pf.data_, &value);</STRONG>
<STRONG>Label38 -> Caption = IntToHex(pf.data_[0],2);</STRONG>
<STRONG>Label39 -> Caption = IntToHex(pf.data_[1],2);</STRONG>
<STRONG>Label40 -> Caption = IntToHex(pf.data_[2],2);</STRONG>
<STRONG>Label41 -> Caption = IntToHex(pf.data_[3],2);</STRONG></P>
<STRONG>
</STRONG></P><FONT size=2>
<STRONG>У прибора при передачи 215.5 = 0x18 - 0x6B - 0x00 </STRONG><FONT color=#ff0000 size=2><FONT color=#ff0000 size=2><STRONG>у меня 0x43- 0x57- 0x80 – 0x00</STRONG></P><FONT size=2>
<STRONG>У прибора при передачи 215.0 = 0x00 - 0xD7 - 0x00 </STRONG><FONT color=#ff0000 size=2><FONT color=#ff0000 size=2><STRONG>у меня 0x43- 0x57- 0x00 – 0x00</STRONG></P><FONT color=#0000ff size=2><FONT color=#1111dd size=2>
<STRONG>Если не обращать внимание на порядок следования, то все правильно делается двумя разными способами</STRONG></P><FONT color=#ff0000 size=2><FONT color=#ff0000 size=2><FONT color=#0000ff size=2><FONT color=#0000ff size=2>
<STRONG>Обратил внимание: </STRONG></P><FONT color=#ff0000 size=2><FONT color=#ff0000 size=2>
<STRONG>255 передается как 0-255-0</STRONG>
<STRONG>256 передается как 1-0-0</STRONG>
<STRONG>256.1 передается как 26-1-0</STRONG>
<STRONG>25.5 пере
Юрчик вне форума  
Старый 25.02.2009, 22:30   #4
Юрчик
Новичок
 
Регистрация: 05.12.2002
Сообщений: 7
Юрчик пока не определено
По умолчанию RE: записать в железку значение float но тремя байтами.

Разработчики писали
Цитата:
</P><DIR><DIR><DIR><DIR><DIR><DIR><DIR><B><FONT size=2>
Знаковое число с односторонней десятичной точкой</P></DIR></DIR></DIR></DIR></DIR></DIR></DIR></B>
Имеет знак (S), десятичный порядок (Exponent), выраженный БЕЗЗНАКОВЫМ числом и указывающий положение ДЕСЯТИЧНОЙ точки (0 для целого числа, 1 для числа с десятыми долями и т.п.) и ненормализованную мантиссу (Mantissa).
S - старший бит
Exponent - 3 следующих бита
Mantissa - остальные биты (длина мантиссы определяется размером поля данных)
Суммарная длина должна составлять целое число байтов
Значение числа можно вычислить, как
(-1)^S * 10^(-Exponent) * Mantissa
Мантисса может выражаться как в двоичном, так и в двоично-десятичном виде.
Например:
-10.38 выражается как 0xA01038 при двоично-десятичном представлении мантиссы
или как 0xA40E, то есть на байт короче, при ее двоичном представлении.</P>
Скорее всего в кривом описании на протокол допущена ошибка и числа передаются в таком формате.
Вопрос
Как мне преобразовать float и передать двумя байтами.
Нужно переделать пример:</P><FONT face="Arial CYR" size=2><FONT face="Arial CYR" size=2>
void Float_psevdo(unsigned char* data, float* value)
{</P><FONT face="Arial CYR" color=#ff0000 size=2><FONT face="Arial CYR" color=#ff0000 size=2><FONT face="Arial CYR" color=#ff0000 size=2>
unsigned char* p = (unsigned char*)(value);
data[2]=p[1]; // этот = 0
data[1]=p[2];
data[0]=p[3];// или этот = 0</P><FONT face="Arial CYR" size=2><FONT face="Arial CYR" size=2>
}
float value = StrToFloat(Edit1 -> Text);
Float_psevdo (pf.data_, &value);
Label38 -> Caption = IntToHex(pf.data_[0],2);
Label39 -> Caption = IntToHex(pf.data_[1],2);
Label40 -> Caption = IntToHex(pf.data_[2],2);
Представлять надо -10.38 как 0xA40E, при ее двоичном представлении.</P>
Юрчик вне форума  
Старый 10.03.2009, 22:06   #5
Юрчик
Новичок
 
Регистрация: 05.12.2002
Сообщений: 7
Юрчик пока не определено
По умолчанию RE: записать в железку значение float но тремя байтами.

<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt <FONT face="Times New Roman" color=#000000 size=3><STRONG><FONT color=#1111bb>На другом форуме подсказали:</STRONG> </P><P class=MsoNormal style="MARGIN: 0cm 0cm 0pt <?xml:namespace prefix = o ns = "urn:schemas-microsoft-comfficeffice" /><o><FONT face="Times New Roman" color=#000000 size=3>
Цитата:
</o><o><o><FONT face="Times New Roman" color=#000000 size=3> </o></P><P class=MsoNormal style="MARGIN: 0cm 0cm 0pt <FONT face="Times New Roman" color=#000000 size=3>float F = StrToFloat(Edit1 -> Text);<o><FONT face="Times New Roman" color=#000000 size=3> </o></P><P class=MsoNormal style="MARGIN: 0cm 0cm 0pt <FONT size=3><FONT color=#000000><FONT face="Times New Roman <SPAN lang=EN-US style="mso-ansi-language: EN-US Label1 -> Caption = FloatToStrF(F, ffFixed, 6, 5); // </SPAN>для<SPAN style="mso-ansi-language: EN-US </SPAN>проверки<SPAN lang=EN-US style="mso-ansi-language: EN-US <o><FONT face="Times New Roman" color=#000000 size=3> </o></SPAN></P><P class=MsoNormal style="MARGIN: 0cm 0cm 0pt <FONT color=#000000><FONT size=3><SPAN lang=EN-US style="mso-ansi-language: EN-US <FONT face="Times New Roman <SPAN style="mso-spacerun: yes </SPAN>if (F >= 10000.0)<SPAN style="mso-spacerun: yes </SPAN>{<SPAN style="mso-spacerun: yes </SPAN></SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: 'Courier New' mso-ansi-language: EN-US ShowMessage("</SPAN><FONT size=3><SPAN style="COLOR: black; FONT-FAMILY: 'Courier New' Ошибка</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: 'Courier New' mso-ansi-language: EN-US , </SPAN><SPAN style="COLOR: black; FONT-FAMILY: 'Courier New' макс</SPAN><SPAN style="COLOR: black; FONT-FAMILY: 'Courier New' mso-ansi-language: EN-US </SPAN><SPAN style="COLOR: black; FONT-FAMILY: 'Courier New' значение</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: 'Courier New' mso-ansi-language: EN-US = 9999");</SPAN><SPAN lang=EN-US style="mso-ansi-language: EN-US <FONT face="Times New Roman <SPAN style="mso-spacerun: yes </SPAN>}<o></o></SPAN></P><P class=MsoNormal style="MARGIN: 0cm 0cm 0pt <SPAN lang=EN-US style="mso-ansi-language: EN-US <FONT size=3><FONT color=#000000><FONT face="Times New Roman <SPAN style="mso-spacerun: yes </SPAN>else<o></o></SPAN></P><P class=MsoNormal style="MARGIN: 0cm 0cm 0pt <SPAN lang=EN-US style="mso-ansi-language: EN-US <FONT size=3><FONT color=#000000><FONT face="Times New Roman <SPAN style="mso-spacerun: yes </SPAN>{<o></o></SPAN></P><P class=MsoNormal style="MARGIN: 0cm 0cm 0pt <SPAN lang=EN-US style="mso-ansi-language: EN-US <FONT size=3><FONT color=#000000><FONT face="Times New Roman <SPAN style="mso-spacerun: yes </SPAN>int Sign = 0;<o></o></SPAN></P><P class=MsoNormal style="MARGIN: 0cm 0cm 0pt <SPAN lang=EN-US style="mso-ansi-language: EN-US <FONT size=3><FONT color=#000000><FONT face="Times New Roman <SPAN style="mso-spacerun: yes </SPAN>if (F < 0.0) { Sign = 1; F = -F; }<o></o></SPAN></P><P class=MsoNormal style="MARGIN: 0cm 0cm 0pt <SPAN lang=EN-US style="mso-ansi-language: EN-US <o><FONT face="Times New Roman" color=#000000 size=3> </o></SPAN></P><P class=MsoNormal style="MARGIN: 0cm 0cm 0pt <SPAN lang=EN-US style="mso-ansi-language: EN-US <FONT size=3><FONT color=#000000><FO 0, 2) + " " + IntToHex(M1, 2) + " " + IntToHex(M2, 2) + </SPAN></P><P class=MsoNormal style="MARGIN: 0cm 0cm 0pt <FONT size=3><FONT color=#000000><FONT face="Times New Roman <SPAN lang=EN-US style="mso-ansi-language: EN-US <SPAN style="mso-spacerun: yes </SPAN>((Len == 4) ? </SPAN>" 00" : "");</P><P class=MsoNormal style="MARGIN: 0cm 0cm 0pt <FONT color=#000000><FONT size=3><SPAN style="mso-spacerun: yes <FONT face="Times New Roman </SPAN><SPAN style="COLOR: black; FONT-FAMILY: 'Courier New' ShowMessage("Результат = " + S);<o></o></SPAN></P><P class=MsoNormal style="MARGIN: 0cm 0cm 0pt <SPAN style="COLOR: black; FONT-FAMILY: 'Courier New' <o><FONT size=3> </o></SPAN></P><P class=MsoNormal style="MARGIN: 0cm 0cm 0pt <FONT size=3><FONT color=#000000><FONT face="Times New Roman <SPAN lang=EN-US style="mso-ansi-language: EN-US <SPAN style="mso-spacerun: yes </SPAN>Label2 -> Caption = FloatToStrF(F, ffFixed, 6, 5); // </SPAN>для<SPAN style="mso-ansi-language: EN-US </SPAN>сравнения<SPAN lang=EN-US style="mso-ansi-language: EN-US <o></o></SPAN></P><P class=MsoNormal style="MARGIN: 0cm 0cm 0pt <SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: 'Courier New' mso-ansi-language: EN-US <o><FONT size=3> </o></SPAN></P><P class=MsoNormal style="MARGIN: 0cm 0cm 0pt <FONT size=3><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: 'Courier New' mso-ansi-language: EN-US <SPAN style="mso-spacerun: yes </SPAN>}</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: 'Courier New' </SPAN></P><P class=MsoNormal style="MARGIN: 0cm 0cm 0pt </o> </P><P class=MsoNormal style="MARGIN: 0cm 0cm 0pt <o><FONT face="Times New Roman" color=#000000 size=3>
</o>
Юрчик вне форума  
Ads
Ответ
Опции темы

Похожие темы
Тема Автор
Функция отправки SMS C++ Builder
Привет всем. Подскажите пожалуйста кто знает. Пишу небольшую программу, в которой должна быть также небольшая функция отправки смс через интернет - конкретного опператора сотовой связи , у данного...
bacho_sun
нужен интерпретатор для макросов C++ Builder
Здравствуйте. Пишу программу (в C++Builder), в которой надо реализовать возможность создания макросов. Синтаксис макросов желательно (но не обязательно) приблизить к Си. Вот пример такого...
John Paramol
Домино на c++Builder C++ Builder
Помогите пожалуйста написать игру домино....или может у кого исходник есть...буду очень благодарна)))
Ушастик
Считывание DXF C++ билдером C++ Builder
Добрый день! Подскажите пожалуйста! у меня такое задание на диплом: нужно считывать dxf файл в билдере. потом его в той же форме редактировать и сохранять в обычном jpg(редактирование примитивное...
dmitry1
C++ Builder Сравнительный анализ эффективности методов сортировки
Здравствуйте помогите мне пожалуйста с курсовой! срок сдачи 22.12.2010 мне нужно провести сравнительный анализ эффективности следующих методов сортировки: линейный выбор с обменом, челночная...
Christi93
C++ Builder графика c++ builder 6.0
дано: имеется несколько равных рядов окружностей, несколько кнопок, которые задают число рядов и кол-во окружностей в них дано2: с графикой никогда не работал, да и с программированием туговато...
zz12



Текущее время: 10:38. Часовой пояс GMT +4.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.

Рейтинг@Mail.ru