Comment l'Arduino gère-t-il le débordement du tampon série? Jette-t-il les données entrantes les plus récentes ou les plus anciennes? Combien d'octets le tampon peut-il contenir?
Comment l'Arduino gère-t-il le débordement du tampon série? Jette-t-il les données entrantes les plus récentes ou les plus anciennes? Combien d'octets le tampon peut-il contenir?
Réponses:
Pour les ports série matériels, vous pouvez voir dans HardwareSerial.cpp que la taille de la mémoire tampon varie en fonction de la quantité de RAM disponible sur l'AVR particulier:
#if (RAMEND < 1000)
#define SERIAL_BUFFER_SIZE 16
#else
#define SERIAL_BUFFER_SIZE 64
#endif
Pour un port série logiciel dans SoftwareSerial.h, la taille de la mémoire tampon du récepteur _SS_MAX_RX_BUFF
est définie comme 64 octets. Dans les deux cas, il cesse d'essayer d'insérer les données reçues dans la file d'attente lorsqu'elle est pleine, vous pouvez donc obtenir un mélange d'anciennes et de nouvelles données selon la façon dont vous récupérez les données de la file d'attente.
Idéalement, il serait préférable de s'assurer que le tampon est toujours vidé rapidement pour éviter le remplissage du tampon. Peut-être jetez un œil aux minuteries et à l'implémentation d'une machine à états simple si votre problème est lié à un autre code bloquant la boucle principale.
Vous pouvez voir à partir de la source de HardwareSerial que si un octet entrant trouve le tampon en anneau plein, il est rejeté:
inline void store_char(unsigned char c, ring_buffer *buffer)
{
int i = (unsigned int)(buffer->head + 1) % SERIAL_BUFFER_SIZE;
// if we should be storing the received character into the location
// just before the tail (meaning that the head would advance to the
// current location of the tail), we're about to overflow the buffer
// and so we don't write the character or advance the head.
if (i != buffer->tail) {
buffer->buffer[buffer->head] = c;
buffer->head = i;
}
}
J'ai l'impression que si je transmets des données à l'Arduino et que je n'ai pas un "extracteur" actif de données du côté de l'Arduino, alors si plus de données arrivent que ce qui peut tenir dans le tampon, elles seront rejetées. Pouvez-vous confirmer cela?
Oui, il sera jeté. Il n'y a pas de contrôle de flux logiciel ou matériel, sauf si vous implémentez le vôtre.
Cependant, avec un tampon de 64 octets et la réception de données à (disons) 9600 bauds, vous obtenez un octet toutes les 1,04 ms, et il faut donc 66,6 ms pour remplir le tampon. Sur un processeur 16 MHz, vous devriez pouvoir vérifier le tampon suffisamment souvent pour qu'il ne se remplisse pas. Tout ce que vous avez vraiment à faire est de déplacer les données du tampon HardwareSerial vers le vôtre, si vous ne voulez pas les traiter maintenant.
Vous pouvez voir à partir de la #if (RAMEND < 1000)
vérification que les processeurs avec plus de 1000 octets de RAM obtiennent le tampon de 64 octets, ceux qui auront moins de RAM obtiendront le tampon de 16 octets.
Les données que vous écrivez sont placées dans un tampon de même taille (16 ou 64 octets). Dans le cas d'envoi si le tampon remplit le code "blocs" en attente d'une interruption pour envoyer l'octet suivant hors du port série.
Si les interruptions sont désactivées, cela ne se produira jamais. Par conséquent, vous n'effectuez pas d' impressions série dans une routine de service d'interruption.
1/960 = 0.001042 s
- soit un octet toutes les 1,04 ms.