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.
0tidak akan menginversi jalur (kondisi idle kedua jalur adalah logika tinggi).UART.INV_TXakan menginversi jalur TX (kondisi idle jalur TX sekarang logika rendah).UART.INV_RXakan menginversi jalur RX (kondisi idle jalur RX sekarang logika rendah).UART.INV_TX | UART.INV_RXakan menginversi kedua jalur (kondisi idle pada logika rendah).
flow menentukan sinyal kontrol aliran perangkat keras mana yang digunakan. Nilainya adalah bitmask.
0akan mengabaikan sinyal kontrol aliran perangkat keras.UART.RTSakan 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.CTSakan mengaktifkan kontrol aliran kirim dengan menghentikan sementara transmisi ketika pin input CTS memberi sinyal bahwa penerima hampir kehabisan ruang buffer.UART.RTS | UART.CTSakan 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 panggildeinit()karena akan mencegah pemanggilaninit()kembali.
- deinit() None¶
Mematikan bus UART.
Catatan
Anda tidak akan dapat memanggil
init()pada objek setelahdeinit(). 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
nbytesditentukan 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
Nonesaat timeout.
- readinto(buf: bytearray, nbytes: int | None = None, /) int | None¶
Membaca byte ke dalam
buf. Jikanbytesditentukan maka baca paling banyak sebanyak itu byte. Jika tidak, baca paling banyaklen(buf)byte. Mungkin kembali lebih awal jika timeout tercapai. Timeout dapat dikonfigurasi di konstruktor.Nilai kembalian: jumlah byte yang dibaca dan disimpan ke dalam
bufatauNonesaat 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
Nonesaat timeout.
- write(buf: bytes) int | None¶
Menulis buffer byte ke bus.
Nilai kembalian: jumlah byte yang ditulis atau
Nonesaat 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
-1saat timeout). Overhead lebih rendah dibandingread(1)karena tidak ada objekbytesyang dialokasikan. Hanya STM32.
- writechar(char: int) None¶
Menulis satu karakter
char(bilangan bulat dalam rentang0--255) ke UART. Overhead lebih rendah dibandingwrite()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
OSErrorsaat 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
Trueketika tidak ada transmisi yang sedang berlangsung (buffer TX kosong dan register geser telah kosong),Falsejika tidak. Berguna sebagai alternatif non-pemblokiran untukflush().
- irq(handler: Callable[[UART], None] | None = None, trigger: int = 0, hard: bool = False) None¶
Memasang callback untuk diaktifkan pada event UART.
handleradalah fungsi yang akan dipanggil. Fungsi menerima instansUARTsebagai satu-satunya argumennya. BerikanNoneuntuk menghapus handler yang telah dipasang sebelumnya.triggeradalah bitmask dari satu atau lebih konstantaIRQ_*(lihat Konstanta di bawah) yang memilih event mana yang mengaktifkan callback.hard=Truemendaftarkan 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
flowuntuk mengaktifkan kontrol aliran perangkat keras RTS di sisi terima. Gabungkan denganCTSmelalui OR untuk mengaktifkan keduanya.
- 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.