classe UART – bus de communication série bidirectionnel

UART implémente le protocole standard de communication série bidirectionnel UART/USART. Au niveau physique, il est constitué de 2 lignes : RX et TX. L’unité de communication est un caractère (à ne pas confondre avec un caractère de chaîne) qui peut faire 8 ou 9 bits de large.

Les objets UART peuvent être créés et initialisés ainsi

from machine import UART

uart = UART(3, 9600)                         # init with given baudrate
uart.init(9600, bits=8, parity=None, stop=1) # init with given parameters

Bits peut valoir 7, 8 ou 9. Stop peut valoir 1 ou 2. Avec parity=None, seuls 8 et 9 bits sont pris en charge. Avec la parité activée, seuls 7 et 8 bits sont pris en charge.

Un objet UART se comporte comme un objet stream et la lecture et l’écriture s’effectuent à l’aide des méthodes de flux standard

uart.read(10)       # read 10 characters, returns a bytes object
uart.read()         # read all available characters
uart.readline()     # read a line
uart.readinto(buf)  # read and store into the given buffer
uart.write('abc')   # write the 3 characters

Constructeurs

class machine.UART(id: int, baudrate: int = 9600, bits: int = 8, parity: int | None = None, stop: int = 1, *, tx: Pin | None = None, rx: Pin | None = None, rts: Pin | None = None, cts: Pin | None = None, txbuf: int | None = None, rxbuf: int | None = None, timeout: int | None = None, timeout_char: int | None = None, invert: int = 0, flow: int = 0)

Construit un objet UART de l’id donné.

Méthodes

init(baudrate: int = 9600, bits: int = 8, parity: int | None = None, stop: int = 1, *, tx: Pin | None = None, rx: Pin | None = None, rts: Pin | None = None, cts: Pin | None = None, txbuf: int | None = None, rxbuf: int | None = None, timeout: int | None = None, timeout_char: int | None = None, invert: int = 0, flow: int = 0) None

Initialise le bus UART avec les paramètres donnés :

  • baudrate est la fréquence d’horloge.

  • bits est le nombre de bits par caractère, 7, 8 ou 9.

  • parity est la parité, None, 0 (paire) ou 1 (impaire).

  • stop est le nombre de bits d’arrêt, 1 ou 2.

Les paramètres supplémentaires, exclusivement nommés, qui peuvent être pris en charge par un port sont :

  • tx spécifie la broche TX à utiliser.

  • rx spécifie la broche RX à utiliser.

  • rts spécifie la broche RTS (sortie) à utiliser pour le contrôle de flux matériel en réception.

  • cts spécifie la broche CTS (entrée) à utiliser pour le contrôle de flux matériel en émission.

  • txbuf spécifie la longueur en caractères du tampon TX.

  • rxbuf spécifie la longueur en caractères du tampon RX.

  • timeout spécifie le temps d’attente du premier caractère (en ms).

  • timeout_char spécifie le temps d’attente entre les caractères (en ms).

  • invert spécifie quelles lignes inverser.

    • 0 n’inversera aucune ligne (l’état de repos des deux lignes est au niveau logique haut).

    • UART.INV_TX inversera la ligne TX (l’état de repos de la ligne TX est désormais au niveau logique bas).

    • UART.INV_RX inversera la ligne RX (l’état de repos de la ligne RX est désormais au niveau logique bas).

    • UART.INV_TX | UART.INV_RX inversera les deux lignes (état de repos au niveau logique bas).

  • flow spécifie quels signaux de contrôle de flux matériel utiliser. La valeur est un masque de bits.

    • 0 ignorera les signaux de contrôle de flux matériel.

    • UART.RTS activera le contrôle de flux en réception en utilisant la broche de sortie RTS pour signaler si la FIFO de réception dispose de suffisamment d’espace pour accepter davantage de données.

    • UART.CTS activera le contrôle de flux en émission en suspendant la transmission lorsque la broche d’entrée CTS signale que le récepteur manque d’espace tampon.

    • UART.RTS | UART.CTS activera les deux, pour un contrôle de flux matériel complet.

Note

Il est possible d’appeler init() plusieurs fois sur le même objet afin de reconfigurer l’UART à la volée. Cela permet d’utiliser un seul périphérique UART pour desservir différents appareils connectés à différentes broches GPIO. Dans ce cas, un seul appareil peut être desservi à la fois. N’appelez pas non plus deinit() car cela empêcherait d’appeler à nouveau init().

deinit() None

Désactive le bus UART.

Note

Vous ne pourrez pas appeler init() sur l’objet après deinit(). Une nouvelle instance doit être créée dans ce cas.

any() int

Renvoie un entier comptant le nombre de caractères pouvant être lus sans blocage. Il renverra 0 s’il n’y a aucun caractère disponible et un nombre positif s’il y a des caractères. La méthode peut renvoyer 1 même s’il y a plus d’un caractère disponible à la lecture.

Pour une interrogation plus sophistiquée des caractères disponibles, utilisez select.poll

poll = select.poll()
poll.register(uart, select.POLLIN)
poll.poll(timeout)
read(nbytes: int | None = None, /) bytes | None

Lit des caractères. Si nbytes est spécifié, lit au plus ce nombre d’octets, sinon lit autant de données que possible. La fonction peut retourner plus tôt si un délai d’expiration est atteint. Le délai d’expiration est configurable dans le constructeur.

Valeur de retour : un objet bytes contenant les octets lus. Renvoie None en cas d’expiration du délai.

readinto(buf: bytearray, nbytes: int | None = None, /) int | None

Lit des octets dans buf. Si nbytes est spécifié, lit au plus ce nombre d’octets. Sinon, lit au plus len(buf) octets. La fonction peut retourner plus tôt si un délai d’expiration est atteint. Le délai d’expiration est configurable dans le constructeur.

Valeur de retour : nombre d’octets lus et stockés dans buf ou None en cas d’expiration du délai.

readline() bytes | None

Lit une ligne, se terminant par un caractère de nouvelle ligne. La fonction peut retourner plus tôt si un délai d’expiration est atteint. Le délai d’expiration est configurable dans le constructeur.

Valeur de retour : la ligne lue ou None en cas d’expiration du délai.

write(buf: bytes) int | None

Écrit le tampon d’octets sur le bus.

Valeur de retour : nombre d’octets écrits ou None en cas d’expiration du délai.

sendbreak() None

Envoie une condition de break sur le bus – met TX au niveau bas pendant plus longtemps que la durée d’un caractère. Disponible sur STM32 et mimxrt ; non exposé sur alif.

readchar() int

Lit un seul caractère depuis l’UART et le renvoie sous forme d’entier (ou -1 en cas d’expiration du délai). Surcoût moindre que read(1) car aucun objet bytes n’est alloué. STM32 uniquement.

writechar(char: int) None

Écrit le caractère unique char (un entier dans la plage 0255) vers l’UART. Surcoût moindre que write() pour les envois d’un seul octet. STM32 uniquement.

flush() None

Bloque jusqu’à ce que chaque octet actuellement présent dans le tampon d’émission ait été émis sur TX. Lève OSError en cas d’expiration du délai ; le délai est dérivé de la taille du tampon TX et du débit en bauds configuré, de sorte que, sauf si le contrôle de flux est activé et que le récepteur se bloque, l’appel retourne bien avant le délai.

txdone() bool

Renvoie True lorsqu’aucune transmission n’est en cours (le tampon TX est vide et le registre à décalage s’est vidé), False sinon. Utile comme alternative non bloquante à flush().

irq(handler: Callable[[UART], None] | None = None, trigger: int = 0, hard: bool = False) None

Installe une fonction de rappel à déclencher sur les événements UART.

handler est la fonction à invoquer. Elle reçoit l’instance UART comme unique argument. Passez None pour supprimer un gestionnaire précédemment installé.

trigger est un masque de bits d’une ou plusieurs constantes IRQ_* (voir Constantes ci-dessous) sélectionnant quels événements déclenchent la fonction de rappel.

hard=True enregistre un gestionnaire d’interruption matérielle (latence moindre, mais le gestionnaire ne doit pas allouer). Par défaut, il s’agit d’une fonction de rappel planifiée.

Renvoie un objet irq.

Toutes les sources d’IRQ ne sont pas disponibles sur tous les ports – consultez les constantes IRQ_* individuelles pour la disponibilité selon le port.

Constantes

RTS: int

À passer à flow pour activer le contrôle de flux matériel RTS côté réception. À combiner avec CTS via OR pour activer les deux.

CTS: int

À passer à flow pour activer le contrôle de flux matériel CTS côté émission.

IRQ_RXIDLE: int

Indicateur de déclenchement irq() : se déclenche une fois qu’un ou plusieurs caractères ont été reçus puis que la ligne RX passe au repos. Disponible sur tous les ports OpenMV.

IRQ_RX: int

Indicateur de déclenchement irq() : se déclenche après chaque caractère reçu. Disponible sur STM32 et alif.

IRQ_TXIDLE: int

Indicateur de déclenchement irq() : se déclenche lorsque le dernier caractère d’une émission a été émis. Disponible sur mimxrt et alif.

IRQ_BREAK: int

Indicateur de déclenchement irq() : se déclenche lorsqu’une condition de break est détectée sur RX. Non disponible sur aucun port OpenMV.