38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
1

Sprintf в fatfs

15.07.2019, 20:29. Показов 3338. Ответов 3

Author24 — интернет-сервис помощи студентам
Помогите, пожалуйста..уже голову сломал

есть в программе модуль GPS. из него получаю координаты в типе float. Вот так:
C
1
2
3
4
5
6
7
8
  
    memset(buf,0,10);
    
    strncpy(buf,GPSFixData.Longitude,3);
    Angle = atoi(buf);
    strncpy(buf,GPSFixData.Longitude+3,7);
    Min = atof(buf);
    LONGITUDE = Angle + (Min/60.0f); // float GPSFixData.lon
LATITUDE, LONGITUDE - глобальные переменные в программе.

чтобы записать координаты во флеш, перевожу float в строку
вот так

C
1
2
3
4
    
    int LONGITUDE_1_len;
        char LONGITUDE_1[10];
LONGITUDE_1_len = sprintf(LONGITUDE_1,"%f\n",LONGITUDE);
но! когда данная строка в цикле while(1), то значение координаты часто перебрасывается в 0. А если для каждой координаты (т.е. две строки) то там почти всегда 0.. почему, не могу понять...
ПИЭС
надеюсьпоможетмнектонибудь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.07.2019, 20:29
Ответы с готовыми решениями:

FatFS в видеопамяти
Иногда у MCU своей RAM гораздо меньше, чем GRAM контроллера дисплея. Тогда можно что-то большое...

FATFS и HardFault
Доброго времени суток! Играюсь с LPC1769 (ARM M3). точнее прикручиваю Fat_FS. В процессе...

Библиотека FatFS
Товарищи, есть ли у кого данная библиотека? Ибо гугл выдает мне битые ссылки на скачивание.

STM32 Fatfs+MS
Всем доброго дня! Возникла следующая проблема - есть плата steval-ccm008v1, с контроллером...

STM32F103 + FatFS
Доброго времени суток! Макет диктофона, SD-Card. Дискретизация 6.250кГц. Буфер 512, через DMA. В...

3
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,512
15.07.2019, 20:41 2
Цитата Сообщение от northcitizen Посмотреть сообщение
то значение координаты часто перебрасывается в 0.
реализована ли в printf(sprintf) печать чисел с плавающей точкой?
в микроконтроллерах часто она выброшена из-за тяжести
смотри в настройках компилятора должна где то включатся
1
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
16.07.2019, 09:05 3
Лучший ответ Сообщение было отмечено northcitizen как решение

Решение

вы не приводите весь текст программы, так что приходится гадать - где применены строчки первой части, и как вы инициализируете GPS. Самое вероятное это -
Данные от GPS имеют больше информации, чем "attitude" и "longtitude", соответственно первая часть просто перетирает данные, неправильно детектируя строку, в которой нет данных о них. В итоге "atof" парсит "не то", и обнуляет координаты.

PS: как быстрый вариант "workaround" - вставьте условия:

C
1
if ((abs(Ang)>1e-5) && (abs(Min)>1e-5)) {LONGITUDE = Angle + (Min/60.0f);}
Есть варианты и по-лучше, конеш .
1
38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
16.07.2019, 11:00  [ТС] 4
Voland_, ValeryS, Спасибо Вам огромное, что помогаете! буду пробовать.

Я GPS инициализировал некрасиво(по тупому). По уарту срабатывает прерывание
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// Прием посылок от GPS-приемника
void USART2_IRQHandler(void)
{
    
 volatile char UsartTemp = 0;
 
 if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
 {
 UsartTemp = USART_ReceiveData(USART2);
 GPSBuf[GPSBufWrPoint] = UsartTemp;
 
 if ((GPSBufWrPoint > 1) && (GPSBufWrPoint < GPSBUFLENGTH)) // Проверка нахождения внутри буфера, чтобы при дальнейшем преобразовании не выскочить за границу
 {
 if ((GPSBuf[GPSBufWrPoint-1] == ',') && (GPSBuf[GPSBufWrPoint] == ','))
 { // Принятая последовательность байт вида ",," превращается в ",0,", тем самым превращая неопределенный параметр в четкий 0
 GPSBuf[GPSBufWrPoint]   = '0';
 GPSBuf[GPSBufWrPoint+1] = ',';
 GPSBufWrPoint++;
 }
 if ((GPSBuf[GPSBufWrPoint-1] == ',') && (GPSBuf[GPSBufWrPoint] == '*'))
 { // Принятая последовательность байт вида ",*" превращается в ",0*", тем самым превращая неопределенный параметр в четкий 0
 GPSBuf[GPSBufWrPoint]   = '0';
 GPSBuf[GPSBufWrPoint+1] = '*';
 GPSBufWrPoint++;
 }
 }
    
 if (GPSBuf[GPSBufWrPoint]!= '\n')
 GPSBufWrPoint++; // Продолжаем заполнять буфер
     else
     { // Если буфер заполнился, начинаем искать и декодировать NMEA сентенции
//__disable_irq();
        //  NMEA_Parser_RMC();
             NMEA_Parser_GLL();
       
             FLAG_GPS = true;
             
       FLAG_MESSAGES++;
             
             GPSBufWrPoint = 0;
//__enable_irq();
     }
         
    }
}
И в прерывании есть функция парсинга
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
uint8_t NMEA_Parser_GLL(void)
{
        char buf[10];
    int Angle;
    float Min;
    
 uint8_t CommaPos;
 uint8_t k;
 uint16_t i,StartPos = 0; // Начало строки
 
 
    
 while (!( (GPSBuf[StartPos]   == '$')
    &&(GPSBuf[StartPos+3] == 'G')
    &&(GPSBuf[StartPos+4] == 'L')
    &&(GPSBuf[StartPos+5] == 'L'))
    && StartPos < 7)
 StartPos++;
 
 // начало пакета слишком сильно смещено, отбрасываем пакет
 if (StartPos>5) return 0;
 
 if (ControlCheckSum(StartPos) == 0) return 0; // Проверка контрольной суммы
 
 memset(&GPSFixData, 0, sizeof(GPSFixData)); // Очищаем структуру
 
 for (i = StartPos+6; i < GPSBUFLENGTH ; i++) // Ждем или конца буфера или последнейй запятой
 {
 if (GPSBuf[i] == ',')
 {
 CommaPos++; // Наращиваем счетчик запятых
 k=0;
 }
 else
 switch (CommaPos) // Пользуемся тем, что данные разделяются запятыми. Неопределенные данные (две запятые подряд) мы заменили нулем в обработчике прерывания USART1_IRQHandler()
 {
 // После первой запятой идет время, но мы возьмем его позже из ZDA сентенции, синхронно с датой
 case 1: if(k < sizeof(GPSFixData.Latitude)-1) GPSFixData.Latitude[k++]=GPSBuf[i]; break;
 case 2: if(k < sizeof(GPSFixData.NS)) GPSFixData.NS=GPSBuf[i]; break;
 case 3: if(k < sizeof(GPSFixData.Longitude)-1) GPSFixData.Longitude[k++]=GPSBuf[i]; break;
 case 4: if(k < sizeof(GPSFixData.EW)) GPSFixData.EW=GPSBuf[i]; break;
 case 5: if(k < sizeof(GPSFixData.UTC)-1) GPSFixData.UTC[k++]=GPSBuf[i]; break;
 case 7: return 1; break; // последня запятая 
 default: break;
 }
   
 
 //переведем широту из вида 5958.84087 в вид 59.9804
  memset(buf,0,10);
    
    strncpy(buf,GPSFixData.Latitude,2);
    Angle = atoi(buf);
    strncpy(buf,GPSFixData.Latitude+2,7);
    Min = atof(buf);
    GPSFixData.lat  = Angle + (Min/60.0f); // float GPSFixData.lat
 
 
 
    memset(buf,0,10);
    
    strncpy(buf,GPSFixData.Longitude,3);
    Angle = atoi(buf);
    strncpy(buf,GPSFixData.Longitude+3,7);
    Min = atof(buf);
    GPSFixData.lon = Angle + (Min/60.0f); // float GPSFixData.lon
 
 }
 
 
 return 1;
}
Вот тут и преобразую. Нужно все убирать из прерываний и делать нормально

Добавлено через 5 минут
ValeryS,
Цитата Сообщение от ValeryS Посмотреть сообщение
реализована ли в printf(sprintf) печать чисел с плавающей точкой?
Спасибо за ответ, нет не реализована. На сайте библиотеки(последняя версия) так написано
f_printf(&fil, "%f", 10.0); /* f_printf lacks floating point support */
0
16.07.2019, 11:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.07.2019, 11:00
Помогаю со студенческими работами здесь

ATmega128 + FatFs
Третий день бьюсь над загадкой, и не выходит каменный цветок. Схему прилагаю. Подключено по SPI...

STM32F4 SD SPI FATFS
Здравствуйте. Есть ли у кого нормально работающая связка? Именно для SPI, SDIO не интересует....

Странное поведение FatFs
Здравствуйте. Такая ситуация. Есть проект, использующий USB флэшку как накопитель. Процессор...

STM32F103 + SD (SDIO) + FatFs
Доброго времени суток. Пытаюсь запустить MicroSD карту совместно с МК STM32F103VCT6. Подключение...

SD FatFs display for TFT
Доброго времени суток, друзья. Я хочу вывести имена файлов из SD карты на дисплей в столбец, как...

FATFS и write buffer
Добрый день! Собираю проект на STM32F4xx (что собственно говоря не важно). Собрал проект в Keil....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru