Witajcie,
Co prawda temat z Arduino, które leży gdzieś w okolicach C++, dlatego pozwoliłem sobie założyć ten wątek. Otóż, w ramach rozwijania nowych skilli, zacząłem dzielić sobie program na pliki h i cpp. Na początku poszło gładko niestety, natknąłem się na moment, gdzie trzeba przekazać parametry do funkcji i odczytać wynik. Tak w skrócie:
- odczytuję dwa 16-bitowe rejestry Modbus, które zawierają wartość kodowaną Big Endian - to działa
- wartość te przekazuję do funkcji, która ma je przekonwertować na float - to też działa, bo już wewnątrz tej funkcji mogę poprawnie wydrukować wcześniej odczytane wartości
- no i niestety - funkcja zwraca mi zero...
Budowa funkcji na pewno jest poprawna, ponieważ umieszczona w głównym pliku *.ino i wywołana np. z loop prawidłowo zmienia te wartości na float. Błąd na 100% polega na moim: złym pojmowaniu składni ? złym skonstruowaniu klasy ? Będę wdzięczny, za podpowiedź.
// klasa w pliku HP_modbus.h:
class HP_modbus {
public:
HP_modbus();
void begin();
void preTransmission();
void postTransmission();
void czytajModbus();
float InttoFloat(uint16_t Data0, uint16_t Data1); // ???
private:
ModbusMaster node;
};
// funkcje w pliku HP_modbus.cpp:
// funkcja odczytuje zawartość rejstrów - dane1, dane2 są drukowane, czyli odczyt ok
void HP_modbus::czytajModbus()
{
uint8_t odczytLicznika;
uint16_t daneZlicznika[2];
odczytLicznika = node.readHoldingRegisters(0x0000, 4);
if (odczytLicznika == node.ku8MBSuccess) {
daneZlicznika[0] = node.getResponseBuffer(0x00);
daneZlicznika[1] = node.getResponseBuffer(0x01);
}
Serial.print("dane1: ");
Serial.println(daneZlicznika[0]);
Serial.print("dane2: ");
Serial.println(daneZlicznika[1]);
EM_A_power = InttoFloat(daneZlicznika[0], daneZlicznika[1]); // funkcja przekształcająca odczytane wartości na float
} // zwraca zero...
float HP_modbus::InttoFloat(uint16_t Data0, uint16_t Data1)
{
// dane drukuje poprawnie:
Serial.println("wejscie do funkcji");
Serial.print("Data0: ");
Serial.println(Data0);
Serial.print("Data1: ");
Serial.println(Data1);
float x;
unsigned long* p;
p = (unsigned long*)&x;
*p = (unsigned long)Data0 << 16 | Data1; //Big-endian
return (x);
}