Si j'ai bien compris, "Serial.Write" remplit un buffer qui envoi les caractères grâce à des interruptions, afin de ne pas "bloquer" le code... j'ai bon ?
Dans ce cas, comment connaitre le niveau de remplissage du buffer afin d'éviter l'overflow ?
Connaitre le niveau comme ça je sais pas, j'imagine qu'il y a un registre qui doit pouvoir renvoyer ça.
Sinon il y a une technique simple : n'envoyer que des paquets de 64 byte (taille par défaut du buffer si ma mémoire est bonne) et attendre l'envoi complet par Serial.flush() avant d'en renvoyer un autre. Après c'est sûr flush() 'est bloquant ... Mais bon 64 bytes ça prend pas 10 ans à envoyer
Avant d'ajouter un flush il faudrait que j'arrive à estimer les différentes "fréquences" qui composent mon code...
La MPU6050 tourne à 100Hz, donc je j'ai des données fraîches à lire 100 fois par seconde...
Et quand j'ai ces données, j'envoi 6 octets à 31250 bauds, ce qui prend environ 1,92ms ?
Donc il faut just que la durée d'envoi des données sur le port série soit cohérente avec la fréquence de d'arrivée des données du MPU...
En fait je pense que l'overflow n'est pas possible.
La fonction write est bloquante en cas de saturation du buffer.
Ce qui pose un autre problème. En cas de saturation l'exécution du programme ne se déroule plus comme prévu.
code tiré de la lib HardwareSerial
size_t HardwareSerial::write(uint8_t c)
{
int i = (_tx_buffer->head + 1) % SERIAL_BUFFER_SIZE;
// If the output buffer is full, there's nothing for it other than to
// wait for the interrupt handler to empty it a bit
// ???: return 0 here instead?
while (i == _tx_buffer->tail) <==== ici on reste bloqué si le buffer est plein
;
_tx_buffer->buffer[_tx_buffer->head] = c;
_tx_buffer->head = i;
sbi(*_ucsrb, _udrie);
// clear the TXC bit -- "can be cleared by writing a one to its bit location"
transmitting = true;
sbi(*_ucsra, TXC0);
return 1;
}