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.
0sẽ không đảo đường nào (trạng thái chờ của cả hai đường là logic cao).UART.INV_TXsẽ đảo đường TX (trạng thái chờ của đường TX nay là logic thấp).UART.INV_RXsẽ đảo đường RX (trạng thái chờ của đường RX nay là logic thấp).UART.INV_TX | UART.INV_RXsẽ đả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.
0sẽ bỏ qua các tín hiệu điều khiển luồng phần cứng.UART.RTSsẽ 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.CTSsẽ 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.CTSsẽ 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ọideinit()vì điều đó sẽ ngăn việc gọiinit()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ọideinit(). 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ề
Nonekhi hết thời gian chờ.
- readinto(buf: bytearray, nbytes: int | None = None, /) int | None¶
Đọc các byte vào
buf. Nếunbytesđược chỉ định thì đọc tối đa số byte đó. Nếu không, đọc tối đalen(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
bufhoặcNonekhi 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
Nonekhi 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
Nonekhi 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
-1khi hết thời gian chờ). Chi phí thấp hơnread(1)vì không phân bổ đối tượngbytes. Chỉ dành cho STM32.
- writechar(char: int) None¶
Ghi ký tự đơn
char(một số nguyên trong khoảng0--255) vào UART. Chi phí thấp hơnwrite()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
OSErrorkhi 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ề
Truekhi 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),Falsenếu không. Hữu ích như một phương án thay thế không chặn choflush().
- 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.
handlerlà hàm được gọi. Nó nhận thực thểUARTlàm đối số duy nhất. TruyềnNoneđể xóa trình xử lý đã cài đặt trước đó.triggerlà 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ớiCTSqua phép OR để bật cả hai.
- 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.