lớp UART -- bus truyền thông nối tiếp song công

UART triển khai giao thức truyền thông nối tiếp song công UART/USART tiêu chuẩn. Ở mức vật lý, nó gồm 2 đường: RX và TX. Đơn vị truyền thông là một ký tự (không nhầm với ký tự chuỗi) có thể rộng 8 hoặc 9 bit.

Đối tượng UART có thể được tạo và khởi tạo như sau:

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 có thể là 7, 8 hoặc 9. Stop có thể là 1 hoặc 2. Với parity=None, chỉ hỗ trợ 8 và 9 bit. Khi bật parity, chỉ hỗ trợ 7 và 8 bit.

Đối tượng UART hoạt động như một đối tượng stream và việc đọc/ghi được thực hiện bằng các phương thức stream tiêu chuẩn:

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

Hàm tạo

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)

Tạo một đối tượng UART với id cho trước.

Phương thức

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

Khởi tạo bus UART với các tham số cho trước:

  • baudrate là tốc độ clock.

  • bits là số bit trên mỗi ký tự, 7, 8 hoặc 9.

  • parity là kiểm tra chẵn lẻ, None, 0 (chẵn) hoặc 1 (lẻ).

  • stop là số bit dừng, 1 hoặc 2.

Các tham số từ khóa bổ sung có thể được hỗ trợ bởi một port là:

  • tx chỉ định chân (pin) TX để sử dụng.

  • rx chỉ định chân (pin) RX để sử dụng.

  • rts chỉ định chân (pin) RTS (đầu ra) để sử dụng cho điều khiển luồng nhận phần cứng.

  • cts chỉ định chân (pin) CTS (đầu vào) để sử dụng cho điều khiển luồng truyền phần cứng.

  • txbuf chỉ định độ dài tính bằng ký tự của bộ đệm TX.

  • rxbuf chỉ định độ dài tính bằng ký tự của bộ đệm RX.

  • timeout chỉ định thời gian chờ ký tự đầu tiên (tính bằng ms).

  • timeout_char chỉ định thời gian chờ giữa các ký tự (tính bằng ms).

  • invert chỉ định các đường cần đảo tín hiệu.

    • 0 sẽ không đảo đường nào (trạng thái chờ của cả hai đường là logic cao).

    • UART.INV_TX sẽ đảo đường TX (trạng thái chờ của đường TX nay là logic thấp).

    • UART.INV_RX sẽ đảo đường RX (trạng thái chờ của đường RX nay là logic thấp).

    • UART.INV_TX | UART.INV_RX sẽ đảo cả hai đường (trạng thái chờ ở logic thấp).

  • flow chỉ định các tín hiệu điều khiển luồng phần cứng cần sử dụng. Giá trị là một bitmask.

    • 0 sẽ bỏ qua các tín hiệu điều khiển luồng phần cứng.

    • UART.RTS sẽ bật điều khiển luồng nhận bằng cách sử dụng chân (pin) đầu ra RTS để báo hiệu khi FIFO nhận còn đủ chỗ để nhận thêm dữ liệu.

    • UART.CTS sẽ bật điều khiển luồng truyền bằng cách tạm dừng truyền khi chân (pin) đầu vào CTS báo hiệu rằng bộ thu đang hết bộ đệm.

    • UART.RTS | UART.CTS sẽ bật cả hai, tạo thành điều khiển luồng phần cứng đầy đủ.

Ghi chú

Có thể gọi init() nhiều lần trên cùng một đối tượng để cấu hình lại UART khi đang chạy. Điều này cho phép sử dụng một ngoại vi UART duy nhất để phục vụ các thiết bị khác nhau gắn vào các chân GPIO khác nhau. Chỉ có thể phục vụ một thiết bị tại một thời điểm trong trường hợp đó. Ngoài ra, không gọi deinit() vì điều đó sẽ ngăn việc gọi init() lại sau này.

deinit() None

Tắt bus UART.

Ghi chú

Bạn sẽ không thể gọi init() trên đối tượng sau khi gọi deinit(). Trong trường hợp đó, cần tạo một thực thể mới.

any() int

Trả về một số nguyên đếm số ký tự có thể đọc mà không bị chặn. Nó sẽ trả về 0 nếu không có ký tự nào và một số dương nếu có ký tự. Phương thức có thể trả về 1 ngay cả khi có nhiều hơn một ký tự sẵn sàng để đọc.

Để truy vấn phức tạp hơn về các ký tự có sẵn, hãy sử dụng select.poll:

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

Đọc các ký tự. Nếu nbytes được chỉ định thì đọc tối đa số byte đó, nếu không thì đọc càng nhiều dữ liệu càng tốt. Hàm có thể trả về sớm hơn nếu hết thời gian chờ. Thời gian chờ có thể cấu hình trong hàm tạo.

Giá trị trả về: một đối tượng bytes chứa các byte đã đọc. Trả về None khi hết thời gian chờ.

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

Đọc các byte vào buf. Nếu nbytes được chỉ định thì đọc tối đa số byte đó. Nếu không, đọc tối đa len(buf) byte. Hàm có thể trả về sớm hơn nếu hết thời gian chờ. Thời gian chờ có thể cấu hình trong hàm tạo.

Giá trị trả về: số byte đã đọc và lưu vào buf hoặc None khi hết thời gian chờ.

readline() bytes | None

Đọc một dòng, kết thúc bằng ký tự xuống dòng. Hàm có thể trả về sớm hơn nếu hết thời gian chờ. Thời gian chờ có thể cấu hình trong hàm tạo.

Giá trị trả về: dòng đã đọc hoặc None khi hết thời gian chờ.

write(buf: bytes) int | None

Ghi bộ đệm bytes lên bus.

Giá trị trả về: số byte đã ghi hoặc None khi hết thời gian chờ.

sendbreak() None

Gửi tín hiệu break trên bus -- kéo TX xuống thấp lâu hơn thời gian một ký tự. Có sẵn trên STM32 và mimxrt; không khả dụng trên alif.

readchar() int

Đọc một ký tự đơn từ UART và trả về dưới dạng số nguyên (hoặc -1 khi hết thời gian chờ). Chi phí thấp hơn read(1) vì không phân bổ đối tượng bytes. Chỉ dành cho STM32.

writechar(char: int) None

Ghi ký tự đơn char (một số nguyên trong khoảng 0 -- 255) vào UART. Chi phí thấp hơn write() cho các lần gửi một byte. Chỉ dành cho STM32.

flush() None

Chặn cho đến khi mọi byte trong bộ đệm truyền đã được xuất ra trên TX. Phát sinh OSError khi hết thời gian chờ; thời gian chờ được tính từ kích thước bộ đệm TX và tốc độ baud đã cấu hình, do đó trừ khi điều khiển luồng được bật và bộ thu bị treo, lệnh gọi trả về trước thời gian chờ.

txdone() bool

Trả về True khi không có quá trình truyền nào đang diễn ra (bộ đệm TX trống và thanh ghi dịch đã xả hết), False nếu không. Hữu ích như một phương án thay thế không chặn cho flush().

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

Cài đặt một hàm gọi lại để kích hoạt khi có sự kiện UART.

handler là hàm được gọi. Nó nhận thực thể UART làm đối số duy nhất. Truyền None để xóa trình xử lý đã cài đặt trước đó.

trigger là bitmask của một hoặc nhiều hằng số IRQ_* (xem phần Hằng số bên dưới) để chọn sự kiện nào kích hoạt hàm gọi lại.

hard=True đăng ký trình xử lý ngắt cứng (độ trễ thấp hơn, nhưng trình xử lý không được phân bổ bộ nhớ). Mặc định là hàm gọi lại theo lịch.

Trả về một đối tượng irq.

Không phải mọi nguồn IRQ đều có sẵn trên mọi port -- xem từng hằng số IRQ_* để biết tính khả dụng theo port.

Hằng số

RTS: int

Truyền vào flow để bật điều khiển luồng phần cứng RTS ở phía nhận. Kết hợp với CTS qua phép OR để bật cả hai.

CTS: int

Truyền vào flow để bật điều khiển luồng phần cứng CTS ở phía truyền.

IRQ_RXIDLE: int

Cờ trigger của irq(): kích hoạt một lần sau khi một hoặc nhiều ký tự được nhận và đường RX sau đó trở về trạng thái chờ. Có sẵn trên tất cả các port OpenMV.

IRQ_RX: int

Cờ trigger của irq(): kích hoạt sau mỗi ký tự được nhận. Có sẵn trên STM32 và alif.

IRQ_TXIDLE: int

Cờ trigger của irq(): kích hoạt khi ký tự cuối cùng của quá trình truyền được xuất ra. Có sẵn trên mimxrt và alif.

IRQ_BREAK: int

Cờ trigger của irq(): kích hoạt khi phát hiện điều kiện break trên RX. Không có sẵn trên bất kỳ port OpenMV nào.