Leggendo le vostre risposte mi è venuto un po' di sconforto dato che temevo una risposta del genere...tuttavia, armato di un po' di pazienza mi sono messo a sbirciare tra le librerie...vi scrivo un po' le considerazioni a cui sono giunto io e vediamo se riusciamo a farne qualcosa di buono.. xD
La libreria Wire fa riferimento all'header wire.h in C:\Program Files (x86)\Arduino\libraries\Robot_Control\arch\avr che a sua volta si lega a wire.cpp sempre in C:\Program Files (x86)\Arduino\libraries\Robot_Control\arch\avr
all'interno della funzione requestFrom viene richiamata la funzione
// perform blocking read into buffer
uint8_t read = twi_readFrom(address, rxBuffer, quantity, sendStop);
twi_readFrom è parte del file twi.c questa volta in C:\Program Files (x86)\Arduino\libraries\Robot_Control\arch\avr\utility
la funzione originale effettivamente NON prevede l'uscita dal ciclo durante il check della linea
Funzione originale
/*
* Function twi_readFrom
* Desc attempts to become twi bus master and read a
* series of bytes from a device on the bus
* Input address: 7bit i2c device address
* data: pointer to byte array
* length: number of bytes to read into array
* sendStop: Boolean indicating whether to send a stop at the end
* Output number of bytes read
*/
uint8_t twi_readFrom(uint8_t address, uint8_t* data, uint8_t length, uint8_t sendStop)
{
uint8_t i;
// ensure data will fit into buffer
if(TWI_BUFFER_LENGTH < length){
return 0;
}
// wait until twi is ready, become master receiver
while(TWI_READY != twi_state){
continue;
}
twi_state = TWI_MRX;
twi_sendStop = sendStop;
// reset error state (0xFF.. no error occured)
twi_error = 0xFF;
// initialize buffer iteration vars
twi_masterBufferIndex = 0;
twi_masterBufferLength = length-1; // This is not intuitive, read on...
// On receive, the previously configured ACK/NACK setting is transmitted in
// response to the received byte before the interrupt is signalled.
// Therefor we must actually set NACK when the _next_ to last byte is
// received, causing that NACK to be sent in response to receiving the last
// expected byte of data.
// build sla+w, slave device address + w bit
twi_slarw = TW_READ;
twi_slarw |= address << 1;
if (true == twi_inRepStart) {
// if we're in the repeated start state, then we've already sent the start,
// (@@@ we hope), and the TWI statemachine is just waiting for the address byte.
// We need to remove ourselves from the repeated start state before we enable interrupts,
// since the ISR is ASYNC, and we could get confused if we hit the ISR before cleaning
// up. Also, don't enable the START interrupt. There may be one pending from the
// repeated start that we sent outselves, and that would really confuse things.
twi_inRepStart = false; // remember, we're dealing with an ASYNC ISR
TWDR = twi_slarw;
TWCR = _BV(TWINT) | _BV(TWEA) | _BV(TWEN) | _BV(TWIE); // enable INTs, but not START
}
else
// send start condition
TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA);
// wait for read operation to complete
while(TWI_MRX == twi_state){
continue;
}
if (twi_masterBufferIndex < length)
length = twi_masterBufferIndex;
// copy twi buffer to data
for(i = 0; i < length; ++i){
data[i] = twi_masterBuffer[i];
}
return length;
}
la modifica che ho pensato riguarda la prima parte e cioè
uint8_t twi_readFrom(uint8_t address, uint8_t* data, uint8_t length, uint8_t sendStop)
{
unsigned long LastEvent = millis(); //by max10891
unsigned long StartEvent = millis(); //by max10891
uint8_t i;
// ensure data will fit into buffer
if(TWI_BUFFER_LENGTH < length){
return 0;
}
// wait until twi is ready, become master receiver --- exit if 200millis of nothing
while(TWI_READY != twi_state && LastEvent-StartEvent>200){
LastEvent=millis(); //by max10891
continue;
}
//by max10891
if(LastEvent-StartEvent>200)
return 0;
.........
.......
........
........
.......
}
in questo modo passati 200 millisencondi senza la linea impiegata dovrebbe uscire dal while e successivamente ritornare 0 come lunghezza...
non ho potuto provarla ora, dovrei provarla nel pomeriggio, secondo voi può avere un senso? se così funzionasse sarebbe utile implementarlo anche nelle altre funzioni tipo la read...ora come ora io ho modificato solo twi_readFrom.....
A più tardi, se avete suggerimenti ben venga!
Max