Go Down

Topic: 'Serial' was not declared in this scope (Read 318 times) previous topic - next topic

DeltaElectronics

Buongiorno...
Poichè vorrei monitorare agevolmente i dati che invio sul canale I2C Arduino, volevo modificare la libreria Wire.h in modo che mi inviasse sul monitor seriale i bytes che invia in I2C.
A tale scopo, dopo qualche elementare investigazione, ho modificato la funzione twi_writeTo() del file twi.c nel seguente modo:
Code: [Select]

uint8_t twi_writeTo(uint8_t address, uint8_t* data, uint8_t length, uint8_t wait, uint8_t sendStop)
{
  uint8_t i;

  // ensure data will fit into buffer
  if(TWI_BUFFER_LENGTH < length){
    return 1;
  }

  // wait until twi is ready, become master transmitter
  while(TWI_READY != twi_state){
    continue;
  }
  twi_state = TWI_MTX;
  twi_sendStop = sendStop;
  // reset error state (0xFF.. no error occured)
  twi_error = 0xFF;

  // initialize buffer iteration vars
  twi_masterBufferIndex = 0;
  twi_masterBufferLength = length;
 
  // copy data to twi buffer
  for(i = 0; i < length; ++i){
    twi_masterBuffer[i] = data[i];
   Serial.println(data[i],HEX);  //Riga aggiunta
  }
....

ma in fase di compilazione, proprio in corrispondenza della riga aggiunta, ottengo l'errore
Code: [Select]
[b]'Serial' was not declared in this scope[/b]
Come potrei rimediare ?

fabpolli

Perdonami ma invece che modificare la libreria standard stampati direttamente quello che contiene il parametro data quando la richiami, al limite fatti una funzione wrapper che richiami la quale stampa il contenuto del parametro e poi richiama la funzione standard passanto in avanti i parametri.
ottieni il risultato, e mantieni standard la libreria, inoltre hai la possibilità di non effettuare la stampa su seriale finita la fase di debug con il solito impiego della #ifdef nel tuo programma.
Inoltre la scrittura su I2C se non ricordo male deve rispettare tempistiche molto stringenti quindi sarebbe meglio non rallentare tale processo con funzionalità lente come la scrittura su seriale.

DeltaElectronics

Code: [Select]
[quote]
Perdonami ma invece che modificare la libreria standard stampati direttamente quello che contiene il parametro data quando la richiami
[/quote]
Il problema è che sto cercando di capire quali comandi una libreria (che si appoggia a Wire.h) invia ad un device (display SSD1306)..
Potrei modificare quest'ultima libreria, ma sarei al punto di partenza.

[quote]
Inoltre la scrittura su I2C se non ricordo male deve rispettare tempistiche molto stringenti quindi sarebbe meglio non rallentare tale processo con funzionalità lente come la scrittura su seriale.
[/quote]
Spulciano il codice, visualizzerei il buffer prima che questo venga inviato su I2C.
Il problema quindi non dovrebbe sussistere.

[quote]
al limite fatti una funzione wrapper che richiami la quale stampa il contenuto del parametro e poi richiama la funzione standard passanto in avanti i parametri.

Come potrei fare nella pratica ?

DeltaElectronics

#3
Jul 29, 2019, 06:54 pm Last Edit: Jul 29, 2019, 07:41 pm by DeltaElectronics
Perdonami ma invece che modificare la libreria standard stampati direttamente quello che contiene il parametro data quando la richiami,
Sto cercando di capire quali comandi una libreria (che si appoggia a Wire.h) invia ad un device (display SSD1306)..
Potrei modificare quest'ultima libreria, ma sarei al punto di partenza.

al limite fatti una funzione wrapper che richiami la funzione standard passanto in avanti i parametri.
Come potrei fare nella pratica ?

Inoltre la scrittura su I2C se non ricordo male deve rispettare tempistiche molto stringenti quindi sarebbe meglio non rallentare tale processo con funzionalità lente come la scrittura su seriale.
Questo non dovrebbe essere un problema... il buffer di comunicazione verrebbe visualizzato prima del suo invio su bus I2C.

fabpolli

#4
Jul 30, 2019, 09:05 am Last Edit: Jul 30, 2019, 09:05 am by fabpolli
Per funzione wrapper intendo una cosa del genere:
Code: [Select]

uint8_t my_writeTo(uint8_t address, uint8_t* data, uint8_t length, uint8_t wait, uint8_t sendStop)
{
   Serial.println(data);
   return twi_writeTo(address, data, length, wait, sendStop);
}

Maurotec

Quote
ma in fase di compilazione, proprio in corrispondenza della riga aggiunta, ottengo l'errore
twi_writeTo è una funzione C del modulo twi.c il cui header twi.h è incluso nel modulo Wire.cpp e quindi non è visibile a meno di dichiararla extern. Inoltre da un modulo C non puoi chiamare una metodo di una istanza di classe C++, quindi se proprio vuoi procedere con la modifica devi agire su Wire.cpp, oppure come dice @fabpolli un funzione wrapper ma al posto di twi_writeTo la size_t TwoWire::write(uint8_t data).

Ma credo che non è la strada più breve se ho capito le tue intenzioni, invece penso che ti potrebbe fare comodo uno sniffer i2c.

Go Up