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.senduart.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ụ 3 cho UART3). 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. Xem init() để 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

TX

P4

RX

P5

Mộ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)

P1

P0

OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal

UART(4)

P2

P3

OpenMV Cam N6

UART(7)

P14

P13

OpenMV 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:

  • baudrate là tốc độ xung clock.

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

  • parity là parity: None, 0 (chẵn) hoặc 1 (lẻ).

  • stop là số bit stop: 1 hoặc 2.

  • flow thiết lập kiểu kiểm soát luồng. Có thể là 0, UART.RTS, UART.CTS hoặc UART.RTS | UART.CTS.

  • timeout là thời gian chờ tính bằng mili giây để đọc/ghi ký tự đầu tiên.

  • timeout_char là thời gian chờ tính bằng mili giây giữa các ký tự khi ghi hoặc đọc.

  • read_buf_len là độ 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.

deinit() None

Tắt bus UART.

any() int

Trả về số byte đang chờ (có thể là 0).

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 nbytes byte 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 nbytes khô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, nbytes phả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ề None khi 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ếu nbytes được chỉ định thì đọc tối đa số byte đó. Ngược lại, đọc tối đa len(buf) byte.

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. 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 None khi 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à buf phả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.

writechar(char: int) None

Ghi một ký tự đơn lên bus. char là số nguyên cần ghi. Xem phần Kiểm soát luồng CTS bên dưới để biết hành vi chặn khi bật kiểm soát luồng CTS.

sendbreak() None

Gửi tín hiệu break trên bus. Điều này kéo bus xuống thấp trong khoảng thời gian 13 bit.

Hằng số

RTS: int

Cờ bit cho tham số flow của init(); bật kiểm soát luồng phần cứng RTS (yêu cầu gửi) trên đường nhận.

CTS: int

Cờ bit cho tham số flow của init(); bật kiểm soát luồng phần cứng CTS (sẵn sàng gửi) trên đường truyền. Có thể OR với RTS để bật cả hai chiều.

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.RTSUART.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 nCTSFalse. Đ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 nCTSFalse, 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.