Перейти к содержанию
    

Принять число в формате с плавающей точкой

Коллеги, приёмник GPS шлёт данные по UART в формате с плавающей точкой. Проблема с преобразованием типа. Раньше принимал ниосом в Аррии-5 Q16, всё работало. Теперь нужно выполнить приём в Циклоне-3 Q13.1 и не выходит каменный цветок. Вот как я раньше преобразовывал:

alt_u16 ConvertCoordinates() {
	double deg_float;
	double c_rad = 180/3.1415926535898;
	alt_u8 i;
	typedef union {
		double word;
	    alt_u8 byte[8];
	} TypeUnion;
	TypeUnion gps;
// Latitude
	for (i=0;i<8;i++) gps.byte[i] = buf_gps[i];// копируем из буфера buf_gps число с плавающей точкой побайтно в union 8 байт (значение в радианах)
	deg_float = c_rad * gps.word;//преобразуем из радиан в градусы
	............................

Буфер buf_gps заполняется из UART. Пробовал читать и так gps.byte = buf_gps[7-i], не помогает.

Что посоветуете, коллеги? Ведь не мог же за три версии так измениться компилятор...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а если так 

double test;
memcpy((char*)&test, buf_gps, sizeof(double));

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

45 минут назад, карамболь сказал:

а если так 


double test;
memcpy((char*)&test, buf_gps, sizeof(double));

 

Тоже ерунду выдаёт, но с методом union не совпадает.

На вот такую восьмибайтную строчку Trimble Studio выдаёт latitude = 48 градусов, а memcpy и union выдают очень малые числа, например degrees = 3.39519326554E-313

        alt_u8 dtest[8]={0xea,0xd4,0xe5,0x6f,0x58,0x41,0x2d,0x3f};

         memcpy((char*)&test, dtest, sizeof(double));
 

36 минут назад, gosha-z сказал:

И ни слова про endianess

Почему? Я выше писал что пробовал в union записывать так : gps.byte = buf_gps[7-i], не помогает. Или вы о другом?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

сейчас попробовал сделать так:

	//преобразование
	data_tsip.word = 48.042;
	for (i=0;i<8;i++) dtest2[i] = data_tsip.byte[i];
	  
	//обратное преобразование
	for (i=0;i<8;i++) data_tsip.byte[i] = dtest2[i];
	data_union = data_tsip.word;
	memcpy((char*)&ttt, dtest2, sizeof(double));
	data_memcpy = ttt;

	//результат
	data_union = 48.042
    data_memcpy = 48.042

Т.е. выходит что к самим преобразованиям претензий нет. Я в ауте...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 minutes ago, _sda said:

сейчас попробовал сделать так:


	//преобразование
	data_tsip.word = 48.042;
	for (i=0;i<8;i++) dtest2[i] = data_tsip.byte[i];
	  
	//обратное преобразование
	for (i=0;i<8;i++) data_tsip.byte[i] = dtest2[i];
	data_union = data_tsip.word;
	memcpy((char*)&ttt, dtest2, sizeof(double));
	data_memcpy = ttt;

	//результат
	data_union = 48.042
    data_memcpy = 48.042

Т.е. выходит что к самим преобразованиям претензий нет. Я в ауте...

Т.е. из Уарта некорректные данные идут ? 

А по поводу union... я ловил проблемы, связанные с выравниванием памяти, причем в дебажной версии все работало, а в релизе софтина падала с сегментейш фаулт 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 минут назад, карамболь сказал:

Т.е. из Уарта некорректные данные идут ? 

х.з. По datasheet этот репорт из приёмника должен состоять из 68-ми байт данных. Реально в снифере я вижу только 67 байт. Захватывал несколько раз - 67 байт.

И в то же время студия нормально показывает координаты. 

К компилятору и С это уже не имеет отношения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, _sda said:

х.з. По datasheet этот репорт из приёмника должен состоять из 68-ми байт данных. Реально в снифере я вижу только 67 байт. Захватывал несколько раз - 67 байт.

И в то же время студия нормально показывает координаты. 

К компилятору и С это уже не имеет отношения.

я бы для начала проверил правильность приема по Uart. Покидайте туда с компа что-нибудь 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, коллега!

У меня уже всё работает. Всему виной моя невнимательность (по жизни я таки великий путаник). 

Перечитал ещё раз datasheet и всё заработало.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...