_sda 0 26 сентября, 2020 Опубликовано 26 сентября, 2020 · Жалоба Коллеги, приёмник 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], не помогает. Что посоветуете, коллеги? Ведь не мог же за три версии так измениться компилятор... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
карамболь 0 28 сентября, 2020 Опубликовано 28 сентября, 2020 · Жалоба а если так double test; memcpy((char*)&test, buf_gps, sizeof(double)); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosha-z 2 28 сентября, 2020 Опубликовано 28 сентября, 2020 · Жалоба И ни слова про endianess Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 28 сентября, 2020 Опубликовано 28 сентября, 2020 · Жалоба 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], не помогает. Или вы о другом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 28 сентября, 2020 Опубликовано 28 сентября, 2020 · Жалоба сейчас попробовал сделать так: //преобразование 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 Т.е. выходит что к самим преобразованиям претензий нет. Я в ауте... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
карамболь 0 28 сентября, 2020 Опубликовано 28 сентября, 2020 · Жалоба 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... я ловил проблемы, связанные с выравниванием памяти, причем в дебажной версии все работало, а в релизе софтина падала с сегментейш фаулт Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 28 сентября, 2020 Опубликовано 28 сентября, 2020 · Жалоба 5 минут назад, карамболь сказал: Т.е. из Уарта некорректные данные идут ? х.з. По datasheet этот репорт из приёмника должен состоять из 68-ми байт данных. Реально в снифере я вижу только 67 байт. Захватывал несколько раз - 67 байт. И в то же время студия нормально показывает координаты. К компилятору и С это уже не имеет отношения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
карамболь 0 28 сентября, 2020 Опубликовано 28 сентября, 2020 · Жалоба 3 hours ago, _sda said: х.з. По datasheet этот репорт из приёмника должен состоять из 68-ми байт данных. Реально в снифере я вижу только 67 байт. Захватывал несколько раз - 67 байт. И в то же время студия нормально показывает координаты. К компилятору и С это уже не имеет отношения. я бы для начала проверил правильность приема по Uart. Покидайте туда с компа что-нибудь Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 28 сентября, 2020 Опубликовано 28 сентября, 2020 · Жалоба Спасибо, коллега! У меня уже всё работает. Всему виной моя невнимательность (по жизни я таки великий путаник). Перечитал ещё раз datasheet и всё заработало. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться