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.
0n’inversera aucune ligne (l’état de repos des deux lignes est au niveau logique haut).UART.INV_TXinversera la ligne TX (l’état de repos de la ligne TX est désormais au niveau logique bas).UART.INV_RXinversera la ligne RX (l’état de repos de la ligne RX est désormais au niveau logique bas).UART.INV_TX | UART.INV_RXinversera 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.
0ignorera les signaux de contrôle de flux matériel.UART.RTSactivera 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.CTSactivera 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.CTSactivera 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 plusdeinit()car cela empêcherait d’appeler à nouveauinit().
- deinit() None¶
Désactive le bus UART.
Note
Vous ne pourrez pas appeler
init()sur l’objet aprèsdeinit(). 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
nbytesest 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
Noneen cas d’expiration du délai.
- readinto(buf: bytearray, nbytes: int | None = None, /) int | None¶
Lit des octets dans
buf. Sinbytesest spécifié, lit au plus ce nombre d’octets. Sinon, lit au pluslen(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
bufouNoneen 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
Noneen 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
Noneen 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
-1en cas d’expiration du délai). Surcoût moindre queread(1)car aucun objetbytesn’est alloué. STM32 uniquement.
- writechar(char: int) None¶
Écrit le caractère unique
char(un entier dans la plage0–255) vers l’UART. Surcoût moindre quewrite()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
OSErroren 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
Truelorsqu’aucune transmission n’est en cours (le tampon TX est vide et le registre à décalage s’est vidé),Falsesinon. 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.
handlerest la fonction à invoquer. Elle reçoit l’instanceUARTcomme unique argument. PassezNonepour supprimer un gestionnaire précédemment installé.triggerest un masque de bits d’une ou plusieurs constantesIRQ_*(voir Constantes ci-dessous) sélectionnant quels événements déclenchent la fonction de rappel.hard=Trueenregistre 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 à
flowpour activer le contrôle de flux matériel RTS côté réception. À combiner avecCTSvia OR pour activer les deux.
- 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.