Envoyez 9 bits sur ARDUINO

Bonjour tout le monde, j'ai un petit problème, j'ai un projet qui consiste a créer un prototype permettant de communiquer avec des cartes électronique.

Cependant, il est cruciale que j'envoie 9 bits pour pouvoir en retour recevoir une réponse, sauf qu'avec Serial.Write() je peux envoyer qu'un Octet, quelqu'un n'aurait pas une solution svp??

Je ne connais pas le code de la fonction Serial.Write(), il ne devrait pas être difficile de le trouver dans les fichiers de l'IDE.

Je connais celui de shiftout() qui est dans le fichier wiring_shift.c.

void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)
{
      uint8_t i;

      for (i = 0; i < 8; i++)  {
            if (bitOrder == LSBFIRST)
                  digitalWrite(dataPin, !!(val & (1 << i)));
            else      
                  digitalWrite(dataPin, !!(val & (1 << (7 - i))));
                  
            digitalWrite(clockPin, HIGH);
            digitalWrite(clockPin, LOW);            
      }
}

Le code de la fonction Serial.Write() ne devrait pas être trop différent.

Il me semble que la modification de :
for (i = 0; i < 8; i++) {

en :
for (i = 0; i < 9; i++) {
devrait être un bon point de départ.

Note : je ne dis pas de modifier le fichier de l'IDE, la modification serait écrasée à la première mise à jour.
je dis de créer ta propre fonction en t'inspirant du code de l'IDE.

J'ajoute, bien que c'est évident, qu'il ne faut pas utiliser un uint8_t mais un uint16_t dont on utilise que 9 bits.
Mais c'est un autre sujet.

Edit :
Je viens de découvrir que pour les micros avr il existe une fonction FastShiftOut().
auteur Rob Tillaart
avec des write8, write16, write 24 et write32

certaines cartes AVR ont un mode 9 bits (la MEGA je crois).

lisez cet ancienne discussion UART with 9 bits

Bonjour,

Neuf bit de data ce n'est pas courant. Est ce que dans ces neuf bits tu comptes le bit de parité?

Tu confirmes que la communication doit se faire avec l'UART?
Si c'est bien avec l'UART, le neuvième bit ne serait pas un bit de parité par hasard?

En mode 8N1, qui est le mode par défaut de Serial sur Arduino, chaque trame UART contient un bit de start, huit bits de données, aucun bit de parité et un bit de stop. La transmission commence par un bit de start à 0, suivi des huit bits de données envoyés du bit de poids faible au bit de poids fort, puis se termine par un bit de stop à 1.

Dans le cas d’une UART configurée en 9 bits, la structure de la trame est similaire, mais avec un bit de données supplémentaire. Cela signifie qu’après le bit de start, neuf bits de données sont transmis au lieu de huit, suivis du bit de stop. Ce neuvième bit peut être utilisé pour envoyer des données sur 9 bits au lieu de 8, ou servir à des usages spécifiques comme un indicateur d’adresse dans un protocole multiprocesseur ou une extension du bit de parité.

En mode 8E1, chaque trame UART contient un bit de start, huit bits de données, un bit de parité paire, et un bit de stop. Le bit de parité est ajusté pour que le nombre total de bits à 1, y compris le bit de parité, soit pair. Si le nombre de bits à 1 dans les données est impair, le bit de parité sera mis à 1 pour rendre ce total pair.

Si vous avez configuré l’UART en 9 bits équivalent, donc En mode 9E1, la trame contient un bit de start, neuf bits de données, un bit de parité paire, et un bit de stop. Le bit de parité fonctionne de la même manière que dans le mode 8E1, mais dans ce cas, il couvre neuf bits de données au lieu de huit.

Le hardware du uno ne supporte pas le mode 9 bits mais celui du Mega oui. Cependant il semble que l’API arduino ne gère pas ça, cf la discussion que j’ai mise en lien

@ilyess7ss

faux : les bits 0 (TX) et 1 (RX) d'UCSR0B servent à ça

Expliquez nous comment vous mettez 9 bits de données natif avec cela (ou mettez vous le 9ème bit ?)

Édit: j’ai relu la doc et effectivement c’est aussi possible sur uno

Bit 2 – UCSZ02: Character Size
The UCSZ2 bits combined with the UCSZ 1:0 bit in UCSRC sets the number of data bits (Character Size) in a frame the Receiver and Transmitter use.

• Bit 1 – RXB80: Receive Data Bit 8
RXB8 is the ninth data bit of the received character when operating with serial frames with nine data bits. Must be read before reading the low bits from UDR.

• Bit 0 – TXB80: Transmit Data Bit 8
TXB8 is the ninth data bit in the character to be transmitted when operating with serial frames with nine data bits. Must be written before writing the low bits to UDR.

comme le répète à l'envi @68tjs : rien ne vaut la lecture des docs éditées par les fabricants de puces eux-mêmes ...

Je m’étais fié à ma mémoire … l’âge … :wink:

Oui je crois que c'est justement un bit de parité le 9ème bit.

Il me semble que oui, c'est bien un bit de Parité.

Dans ce cas c'est géré automatiquement par l'UART.
Il suffit de passer en paramètre à Serial.begin() le type de parité que tu veux
https://docs.arduino.cc/language-reference/en/functions/communication/serial/begin/

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.