Функция c ++ в Arduino esp8266 изменяет число с плавающей запятой, сгенерированное в файле c, тарабарщина, наблюдаемая в файле c после выхода из функции c ++

Я пишу код для концентратора IoT Azure, который требует использования c-функций в цикле Arduino (). Проблема, с которой я сталкиваюсь, заключается в том, что если я передам указатель на число с плавающей точкой, созданное в c-файле, в файл c ++ и изменим значение, то, что видно в c-файле после возврата из функции c ++, это бессмысленно.

Вот пример psuedocode, и рабочий пример включен ниже:

loop () в файле ino:
запускает runInLoop (), определенный в c-файле RunTest.c

runInLoop () в RunTest.c:
создать поплавок
передать адрес в модификациюFloat (float * address), определенный в FloatTest.cpp
выведите значение типа float после того, как modifyFloat () вернется.

modifyFloat (float * address) в FloatTest.cpp:
назначить вейл на * адрес
напечатать значение
вернуть

Я выполнил этот псевдокод в рабочем примере ниже, и результат в последовательном мониторе:

Value assigned in modifyFloat: 22.55
The value that was returned is: 1077316812

Я использую перо Adafruit Huzzah Feather, настроенное точно так, как указано в его документации.

Вот рабочий пример:

#include "RunTest.h"
void setup()
{
initSerial();
}

void loop()
{
Serial.println("Starting main loop!\r\n");
runInLoop();
}

void initSerial()
{
Serial.begin(9600);
}
#include "FloatTest.h"
void runInLoop(void)
{
while(1)
{
float testValue;
modifyFloat(&testValue);
(void)printf("The value that was returned is: %d\r\n", testValue);
delay(1000);
}

}
#ifndef RUNTEST_H
#define RUNTEST_H

#ifdef __cplusplus
extern "C" {
#endif

void runInLoop(void);

#ifdef __cplusplus
}
#endif

#endif // RUNTEST_H
#include <Arduino.h>
#include "FloatTest.h"
void modifyFloat(float *address)
{
*address = 22.55;
Serial.print("Value assigned in modifyFloat: ");
Serial.println(*address);
}
#ifndef FLOATTEST_H
#define FLOATTEST_H

#ifdef __cplusplus
extern "C" {
#endif

void modifyFloat(float* address);

#ifdef __cplusplus
}
#endif

#endif // FLOATTEST_H

-1

Решение

Проблема заключалась в использовании% d в строке printf в RunTest.c. Обновление кода, показанного ниже, устраняет проблему и выдает результат:

Value seen in modifyFloat: 22.55
The value that was returned is: 22.55
#include "FloatTest.h"
void runInLoop(void)
{
while(1)
{
float testValue;
modifyFloat(&testValue);
char str_tmp[6];
dtostrf(testValue, 4, 2, str_tmp);
(void)printf("The value that was returned is: %s\r\n", str_tmp);
delay(1000);
}

}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]