kelas UART -- bus komunikasi serial dupleks

UART mengimplementasikan protokol komunikasi serial dupleks UART/USART standar. Pada level fisik terdiri dari 2 jalur: RX dan TX. Unit komunikasi adalah karakter (jangan disamakan dengan karakter string) yang dapat berukuran 8 atau 9 bit.

Objek UART dapat dibuat dan diinisialisasi menggunakan:

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 dapat berupa 7, 8 atau 9. Stop dapat berupa 1 atau 2. Dengan parity=None, hanya 8 dan 9 bit yang didukung. Dengan paritas diaktifkan, hanya 7 dan 8 bit yang didukung.

Objek UART bertindak seperti objek stream dan pembacaan serta penulisan dilakukan menggunakan metode stream standar:

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

Konstruktor

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)

Membuat objek UART dengan id yang diberikan.

Metode

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

Menginisialisasi bus UART dengan parameter yang diberikan:

  • baudrate adalah laju clock.

  • bits adalah jumlah bit per karakter, 7, 8 atau 9.

  • parity adalah paritas, None, 0 (genap) atau 1 (ganjil).

  • stop adalah jumlah stop bit, 1 atau 2.

Parameter keyword-only tambahan yang mungkin didukung oleh suatu port adalah:

  • tx menentukan pin TX yang digunakan.

  • rx menentukan pin RX yang digunakan.

  • rts menentukan pin RTS (output) yang digunakan untuk kontrol aliran terima perangkat keras.

  • cts menentukan pin CTS (input) yang digunakan untuk kontrol aliran kirim perangkat keras.

  • txbuf menentukan panjang dalam karakter dari buffer TX.

  • rxbuf menentukan panjang dalam karakter dari buffer RX.

  • timeout menentukan waktu tunggu untuk karakter pertama (dalam ms).

  • timeout_char menentukan waktu tunggu antar karakter (dalam ms).

  • invert menentukan jalur mana yang diinversi.

    • 0 tidak akan menginversi jalur (kondisi idle kedua jalur adalah logika tinggi).

    • UART.INV_TX akan menginversi jalur TX (kondisi idle jalur TX sekarang logika rendah).

    • UART.INV_RX akan menginversi jalur RX (kondisi idle jalur RX sekarang logika rendah).

    • UART.INV_TX | UART.INV_RX akan menginversi kedua jalur (kondisi idle pada logika rendah).

  • flow menentukan sinyal kontrol aliran perangkat keras mana yang digunakan. Nilainya adalah bitmask.

    • 0 akan mengabaikan sinyal kontrol aliran perangkat keras.

    • UART.RTS akan mengaktifkan kontrol aliran terima dengan menggunakan pin output RTS untuk memberi sinyal apakah FIFO penerima memiliki ruang yang cukup untuk menerima lebih banyak data.

    • UART.CTS akan mengaktifkan kontrol aliran kirim dengan menghentikan sementara transmisi ketika pin input CTS memberi sinyal bahwa penerima hampir kehabisan ruang buffer.

    • UART.RTS | UART.CTS akan mengaktifkan keduanya, untuk kontrol aliran perangkat keras penuh.

Catatan

Dimungkinkan untuk memanggil init() beberapa kali pada objek yang sama untuk mengkonfigurasi ulang UART secara langsung. Hal ini memungkinkan penggunaan satu periferal UART untuk melayani berbagai perangkat yang terhubung ke pin GPIO yang berbeda. Hanya satu perangkat yang dapat dilayani pada satu waktu dalam kasus tersebut. Juga jangan panggil deinit() karena akan mencegah pemanggilan init() kembali.

deinit() None

Mematikan bus UART.

Catatan

Anda tidak akan dapat memanggil init() pada objek setelah deinit(). Instans baru perlu dibuat dalam kasus tersebut.

any() int

Mengembalikan bilangan bulat yang menghitung jumlah karakter yang dapat dibaca tanpa pemblokiran. Akan mengembalikan 0 jika tidak ada karakter yang tersedia dan angka positif jika ada karakter. Metode ini mungkin mengembalikan 1 meskipun tersedia lebih dari satu karakter untuk dibaca.

Untuk kueri karakter yang tersedia yang lebih canggih gunakan select.poll:

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

Membaca karakter. Jika nbytes ditentukan maka baca paling banyak sebanyak itu byte, jika tidak baca sebanyak mungkin data. Mungkin kembali lebih awal jika timeout tercapai. Timeout dapat dikonfigurasi di konstruktor.

Nilai kembalian: objek bytes yang berisi byte yang dibaca. Mengembalikan None saat timeout.

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

Membaca byte ke dalam buf. Jika nbytes ditentukan maka baca paling banyak sebanyak itu byte. Jika tidak, baca paling banyak len(buf) byte. Mungkin kembali lebih awal jika timeout tercapai. Timeout dapat dikonfigurasi di konstruktor.

Nilai kembalian: jumlah byte yang dibaca dan disimpan ke dalam buf atau None saat timeout.

readline() bytes | None

Membaca satu baris, diakhiri dengan karakter baris baru. Mungkin kembali lebih awal jika timeout tercapai. Timeout dapat dikonfigurasi di konstruktor.

Nilai kembalian: baris yang dibaca atau None saat timeout.

write(buf: bytes) int | None

Menulis buffer byte ke bus.

Nilai kembalian: jumlah byte yang ditulis atau None saat timeout.

sendbreak() None

Mengirim kondisi break pada bus -- menggerakkan TX rendah lebih lama dari satu waktu karakter. Tersedia pada STM32 dan mimxrt; tidak tersedia pada alif.

readchar() int

Membaca satu karakter dari UART dan mengembalikannya sebagai bilangan bulat (atau -1 saat timeout). Overhead lebih rendah dibanding read(1) karena tidak ada objek bytes yang dialokasikan. Hanya STM32.

writechar(char: int) None

Menulis satu karakter char (bilangan bulat dalam rentang 0 -- 255) ke UART. Overhead lebih rendah dibanding write() untuk pengiriman satu byte. Hanya STM32.

flush() None

Memblokir hingga setiap byte yang saat ini ada di buffer transmisi telah di-clock keluar di TX. Memunculkan OSError saat timeout; timeout diturunkan dari ukuran buffer TX dan laju baud yang dikonfigurasi, sehingga kecuali kontrol aliran diaktifkan dan penerima macet, panggilan kembali jauh sebelum timeout.

txdone() bool

Mengembalikan True ketika tidak ada transmisi yang sedang berlangsung (buffer TX kosong dan register geser telah kosong), False jika tidak. Berguna sebagai alternatif non-pemblokiran untuk flush().

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

Memasang callback untuk diaktifkan pada event UART.

handler adalah fungsi yang akan dipanggil. Fungsi menerima instans UART sebagai satu-satunya argumennya. Berikan None untuk menghapus handler yang telah dipasang sebelumnya.

trigger adalah bitmask dari satu atau lebih konstanta IRQ_* (lihat Konstanta di bawah) yang memilih event mana yang mengaktifkan callback.

hard=True mendaftarkan handler interupsi keras (latensi lebih rendah, tetapi handler tidak boleh mengalokasikan memori). Default adalah callback terjadwal.

Mengembalikan objek irq.

Tidak setiap sumber IRQ tersedia di setiap port -- lihat konstanta IRQ_* individual untuk ketersediaan per-port.

Konstanta

RTS: int

Berikan ke flow untuk mengaktifkan kontrol aliran perangkat keras RTS di sisi terima. Gabungkan dengan CTS melalui OR untuk mengaktifkan keduanya.

CTS: int

Berikan ke flow untuk mengaktifkan kontrol aliran perangkat keras CTS di sisi kirim.

IRQ_RXIDLE: int

Flag trigger irq(): aktif sekali setelah satu atau lebih karakter diterima dan jalur RX kemudian menjadi idle. Tersedia pada semua port OpenMV.

IRQ_RX: int

Flag trigger irq(): aktif setelah setiap karakter yang diterima. Tersedia pada STM32 dan alif.

IRQ_TXIDLE: int

Flag trigger irq(): aktif ketika karakter terakhir dari suatu transmisi telah di-clock keluar. Tersedia pada mimxrt dan alif.

IRQ_BREAK: int

Flag trigger irq(): aktif ketika kondisi break terdeteksi pada RX. Tidak tersedia pada port OpenMV mana pun.