Как преобразовать из double64.
- Войдите на сайт для отправки комментариев
Пнд, 03/11/2014 - 21:54
Добрый день,
Хочется вывести показания с счетчика воды на lcd.
Счетчик выдает значения как double64 младшим байтом вперед а именно 000000c0298c6741.
Перевернув получаем 41678c29c0000000 конвертируем через сайт http://babbage.cs.qc.cuny.edu/IEEE-754.old/64bit.html получаем 12345678.000000000.
Собственно как на Ардуино микро преобразовать double64 000000c0298c6741 в 12345678.000000000 ?
сначала так https://www.google.com/search?hl=ru&q=arduino+double64&gws_rd=ssl , если возникнут вопросы - обращайся.
я думаю както так :
union { double db byte b[8]; }un;после чего в нужном порядке заполняете b[x], а из db считываете в том типе который вам надо.
Что то не выходит, note: no known conversion for argument 1 from 'double' to 'String'
#include <LCD5110_Basic.h> LCD5110 myGLCD(8,9,10,11,12); extern uint8_t SmallFont[]; union { double db; byte b[8]; } un; void setup() { un.b=41678c29c0000000; myGLCD.InitLCD(); myGLCD.setFont(SmallFont); } void loop() { myGLCD.clrScr(); myGLCD.print("TEST", CENTER, 0); myGLCD.print(un.db, CENTER, 16); delay (5000); }Доброго времени суток !
Дело в том, что метод вашего объекта myGLCD.print первым аргументом требует строку, а вы ему подсоввываете double. Во вторых - массив так:un.b=41678c29c0000000; не заполняется.
я думаю правильней будет вот так:
#include <LCD5110_Basic.h> LCD5110 myGLCD(8,9,10,11,12); extern uint8_t SmallFont[]; union { double db; byte b[8]; } un; byte bs[]={0x00,0x00,0x00,0xc0,0x29,0x8c,0x67,0x41}; char str1[32]; double fromBytes(byte *b) { for(i=0;i<8;i++) { un.b[i]=b[7-i]; } return(un.db); } void setup() { sprintf(str1,"%f",fromBytes(bs)); myGLCD.InitLCD(); myGLCD.setFont(SmallFont); } void loop() { myGLCD.clrScr(); myGLCD.print("TEST", CENTER, 0); myGLCD.print(str1, CENTER, 16); delay (5000); }А еще правильней будет так:
#include <LCD5110_Basic.h> LCD5110 myGLCD(8,9,10,11,12); extern uint8_t SmallFont[]; typedef union { double db; byte b[8]; } DByte; byte bs[]={0x00,0x00,0x00,0xc0,0x29,0x8c,0x67,0x41}; char str1[32]; double fromBytes(byte *b) { DByte un; for(int i=0;i<8;i++) { un.b[i]=b[7-i]; } return(un.db); } void setup() { sprintf(str1,"%f",fromBytes(bs)); myGLCD.InitLCD(); myGLCD.setFont(SmallFont); } void loop() { myGLCD.clrScr(); myGLCD.print("TEST", CENTER, 0); myGLCD.print(str1, CENTER, 16); delay (5000); }что бы память на конвертацию выделялась динамически
Спасибо за помощь, но где то закралась ошибка.
На lcd выводит знак ?
Попробуйте так, если не правильный результат даст попробуйте заменить на un.b[i]=b[i]; без переворота
на компе у меня так и прошло.
#include <stdio.h> unsigned char bs[]={0x00,0x00,0x00,0xc0,0x29,0x8c,0x67,0x41}; typedef union { double db; unsigned char b[8]; } DByte; double fromByte(unsigned char *b) { DByte un; for(int i=0;i<8;i++) { un.b[i]=b[i]; } return(un.db); } int main() { printf("%f, %lu\n",fromByte(bs),sizeof(double)); return(0); }результат:
12345678.000000, 8