Я пишу код для концентратора 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
Проблема заключалась в использовании% 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);
}
}
Других решений пока нет …