Oggi, mentre stavo giocherellando con l'IDE di Arduino, mi sono imbattuto in uno strano errore, fortunatamente, facilmente riproducibile ...
Notare che il BUG è presente sia nella 1.0.5 che nella 1.5.6-r2.
Aprite l'IDE e caricate l'esempio della libreria Wire -> master_reader ...
Se lo compilate così come è vedrete che non c'è alcun errore e la compilazione riesce. Provate ora a renderlo più generico sostituendo l'indirizzo fisso del device I2C, nella Wire.requestFrom() con una valore costante.
Dichiarate, ad inizio programma, una costante di tipo uint8_t :
const uint8_t myAddr = 0x02;
e correggete la riga nel loop() per utilizzare tale valore costante :
Wire.requestFrom(myAddr, 6); // request 6 bytes from slave device #2
ricompilate e ... sorpresa :
master_reader.ino: In function 'void loop()':
master_reader.ino:25: error: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
/Applications/Arduino 1.5.6-r2.app/Contents/Resources/Java/hardware/arduino/avr/libraries/Wire/Wire.h:58: note: candidate 1: uint8_t TwoWire::requestFrom(int, int)
/Applications/Arduino 1.5.6-r2.app/Contents/Resources/Java/hardware/arduino/avr/libraries/Wire/Wire.h:56: note: candidate 2: uint8_t TwoWire::requestFrom(uint8_t, uint8_t)
... un errore a cui non trovo alcuna giustificazione, anche perché, se andate a vedere dentro la libreria Wire, scoprite che il metodo requestFrom() è così definito :
uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint8_t sendStop)
La cosa più assurda è che vedrete scomparire l'errore (... ma non so se poi il tutto funzioni correttamente) facendo un casting sbagliato ! Difatti, se mettete :
Wire.requestFrom((uint16_t)myAddr, 6); // request 6 bytes from slave device #2
la compilazione va a buon fine ...
L'unico modo, ovviamente, per parametrizzare la cosa è NON usare una costante (... metodo che invece è sempre consigliabile), ma una #define. Difatti, se invece del const, mettete :
#define myAddr 0x02
... il valore viene semplicemente sostituito e tutto viene compilato correttamente ...
A rafforzare l'dea di un BUG nel compilatore presente nell'IDE di Arduino e il fatto che ... se si sostituise la Toolchain con la nuova (Toolchain 3.4.3, avr gcc 4.8.1) ... l'errore scompare ... ] ] ]
Guglielmo