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 dây: 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.
Các đối tượng UART có thể được tạo và khởi tạo như sau:
from pyb import UART
# init with the given baudrate
uart = UART(3, 9600, timeout_char=1000)
# init with explicit parameters
uart.init(9600, bits=8, parity=None, stop=1, timeout_char=1000)
Số bit có thể là 7, 8 hoặc 9. Parity có thể là None, 0 (chẵn) hoặc 1 (lẻ). Stop có thể là 1 hoặc 2.
Lưu ý: 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 giống đố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
Có thể đọc/ghi từng ký tự riêng lẻ bằng cách:
uart.readchar() # read 1 character and returns it as an integer
uart.writechar(42) # write 1 character
Để kiểm tra xem có dữ liệu để đọc hay không, dùng:
uart.any() # returns the number of characters waiting
Lưu ý: Các hàm stream read, write, v.v. là tính năng mới trong MicroPython v1.3.4. Các phiên bản trước dùng uart.send và uart.recv.
Hàm khởi tạo¶
- class pyb.UART(bus: int | str, *args, **kwargs)¶
Khởi tạo đối tượng UART trên
busđã cho (một chỉ số ngoại vi nguyên, ví dụ3choUART3). Nếu không có tham số bổ sung, đối tượng được tạo nhưng chưa khởi tạo (nó giữ nguyên cài đặt bus trước đó, nếu có); nếu có thêm tham số thì bus sẽ được khởi tạo. Xeminit()để biết các tham số khả dụng.UART(3)được kết nối với các chân header giống nhau trên mọi OpenMV Cam STM32:Tín hiệu
Chân header
TXP4RXP5Một số board có thêm các bus UART khác:
Bus
Chân TX
Chân RX
Có sẵn trên
UART(1)P1P0OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal
UART(4)P2P3OpenMV Cam N6
UART(7)P14P13OpenMV Cam N6
Phương thức¶
- init(baudrate: int, bits: int = 8, parity: int | None = None, stop: int = 1, *, timeout: int = 1000, flow: int = 0, timeout_char: int = 0, read_buf_len: int = 64) None¶
Khởi tạo bus UART với các tham số đã cho:
baudratelà tốc độ xung clock.bitslà số bit trên mỗi ký tự: 7, 8 hoặc 9.paritylà parity:None, 0 (chẵn) hoặc 1 (lẻ).stoplà số bit stop: 1 hoặc 2.flowthiết lập kiểu kiểm soát luồng. Có thể là 0,UART.RTS,UART.CTShoặcUART.RTS | UART.CTS.timeoutlà thời gian chờ tính bằng mili giây để đọc/ghi ký tự đầu tiên.timeout_charlà thời gian chờ tính bằng mili giây giữa các ký tự khi ghi hoặc đọc.read_buf_lenlà độ dài ký tự của bộ đệm đọc (0 để tắt).
Phương thức này sẽ đưa ra ngoại lệ nếu không thể đặt tốc độ baud trong phạm vi 5% so với giá trị mong muốn.
Lưu ý: với parity=None, chỉ hỗ trợ 8 và 9 bit. Khi bật parity, chỉ hỗ trợ 7 và 8 bit.
- 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ếunbytesbyte có sẵn trong bộ đệm, hàm trả về ngay lập tức; ngược lại, hàm chờ đến khi đủ ký tự đến hoặc hết thời gian chờ.Nếu
nbyteskhông được chỉ định thì phương thức đọc càng nhiều dữ liệu càng tốt. Hàm trả về sau khi hết thời gian chờ.Lưu ý: với ký tự 9 bit, mỗi ký tự chiếm hai byte,
nbytesphải là số chẵn và số ký tự lànbytes/2.Giá trị trả về: đối tượng bytes chứa các byte đã đọc. Trả về
Nonekhi hết thời gian chờ.
- readchar() int¶
Nhận một ký tự đơn từ bus.
Giá trị trả về: ký tự đã đọc dưới dạng số nguyên. Trả về -1 khi 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 đó. Ngược lại, đọc tối đalen(buf)byte.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. Nếu dòng đó tồn tại thì trả về ngay lập tức. Nếu hết thời gian chờ, tất cả dữ liệu hiện có sẽ được trả về bất kể có ký tự xuống dòng hay không.
Giá trị trả về: dòng đã đọc hoặc
Nonekhi hết thời gian chờ nếu không có dữ liệu.
- write(buf: bytes | bytearray | str) int | None¶
Ghi bộ đệm byte lên bus. Nếu các ký tự rộng 7 hoặc 8 bit thì mỗi byte là một ký tự. Nếu ký tự rộng 9 bit thì hai byte được dùng cho mỗi ký tự (little endian), và
bufphải chứa số byte chẵn.Giá trị trả về: số byte đã ghi. Nếu hết thời gian chờ và không có byte nào được ghi thì trả về
None.
Hằng số¶
Kiểm soát luồng¶
UART(3) hỗ trợ kiểm soát luồng phần cứng RTS/CTS. Trên OpenMV Cam M7, H7, H7 Plus và Pure Thermal, các chân kiểm soát luồng là:
(TX, RX, nRTS, nCTS) = (P4, P5, P1, P2)
Trên OpenMV Cam N6 chỉ có nRTS được đưa ra ngoài (trên chân header P7); nCTS không được nối tới header I/O.
Trong các đoạn sau, thuật ngữ "target" đề cập đến thiết bị được kết nối với UART.
Khi phương thức init() của UART được gọi với flow được đặt thành một hoặc cả hai giá trị UART.RTS và UART.CTS, các chân kiểm soát luồng tương ứng sẽ được cấu hình. nRTS là đầu ra tích cực thấp và nCTS là đầu vào tích cực thấp với pull-up được bật. Để kết nối kiểm soát luồng, hãy nối nCTS của OpenMV Cam với nRTS của thiết bị đích và nRTS của OpenMV Cam với nCTS của thiết bị đích.
CTS: thiết bị đích điều khiển bộ phát OpenMV Cam¶
Nếu bật kiểm soát luồng CTS, hành vi ghi như sau:
Nếu phương thức UART.write(buf) của OpenMV Cam được gọi, quá trình truyền sẽ bị treo trong mọi khoảng thời gian nCTS là False. Điều này sẽ dẫn đến hết thời gian chờ nếu toàn bộ bộ đệm không được truyền trong khoảng thời gian chờ. Phương thức trả về số byte đã ghi, cho phép người dùng ghi phần còn lại của dữ liệu nếu cần. Trong trường hợp hết thời gian chờ, một ký tự sẽ nằm lại trong UART chờ nCTS. Số byte tạo thành ký tự này sẽ được bao gồm trong giá trị trả về.
Nếu UART.writechar() được gọi khi nCTS là False, phương thức sẽ hết thời gian chờ trừ khi thiết bị đích xác nhận nCTS kịp thời. Nếu hết thời gian chờ, OSError 116 sẽ được đưa ra. Ký tự sẽ được truyền ngay khi thiết bị đích xác nhận nCTS.
RTS: OpenMV Cam điều khiển bộ phát của thiết bị đích¶
Nếu bật kiểm soát luồng RTS, hành vi như sau:
Nếu sử dụng đầu vào có bộ đệm (read_buf_len > 0), các ký tự đến sẽ được lưu vào bộ đệm. Nếu bộ đệm đầy, ký tự tiếp theo đến sẽ khiến nRTS chuyển sang False: thiết bị đích nên ngừng truyền. nRTS sẽ chuyển về True khi các ký tự được đọc ra khỏi bộ đệm.
Lưu ý rằng phương thức any() trả về số byte trong bộ đệm. Giả sử độ dài bộ đệm là N byte. Nếu bộ đệm đầy và một ký tự khác đến, nRTS sẽ được đặt thành False và any() sẽ trả về số đếm N. Khi các ký tự được đọc, ký tự bổ sung sẽ được đưa vào bộ đệm và sẽ được tính vào kết quả của lần gọi any() tiếp theo.
Nếu không sử dụng đầu vào có bộ đệm (read_buf_len == 0), khi có ký tự đến, nRTS sẽ chuyển sang False cho đến khi ký tự đó được đọc.