คลาส UART -- บัสสื่อสารแบบอนุกรมดูเพล็กซ์

UART ใช้งานโปรโตคอลการสื่อสารแบบอนุกรม UART/USART ดูเพล็กซ์มาตรฐาน ในระดับทางกายภาพประกอบด้วยสายสัญญาณ 2 เส้น ได้แก่ RX และ TX หน่วยการสื่อสารคืออักขระ (ไม่ควรสับสนกับอักขระในสตริง) ซึ่งมีความกว้างได้ 8 หรือ 9 บิต

สามารถสร้างและกำหนดค่าออบเจกต์ UART ได้ดังนี้:

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)

บิตสามารถเป็น 7, 8 หรือ 9 ได้ พาริตีสามารถเป็น None, 0 (คู่) หรือ 1 (คี่) สต็อปสามารถเป็น 1 หรือ 2

หมายเหตุ: เมื่อใช้ parity=None จะรองรับเฉพาะ 8 และ 9 บิตเท่านั้น เมื่อเปิดใช้พาริตี จะรองรับเฉพาะ 7 และ 8 บิตเท่านั้น

ออบเจกต์ UART ทำงานเหมือนออบเจกต์ stream และการอ่านเขียนใช้วิธีการสตรีมมาตรฐาน:

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

สามารถอ่านและเขียนอักขระแต่ละตัวได้โดยใช้:

uart.readchar()     # read 1 character and returns it as an integer
uart.writechar(42)  # write 1 character

หากต้องการตรวจสอบว่ามีข้อมูลรอการอ่านหรือไม่ ให้ใช้:

uart.any()          # returns the number of characters waiting

หมายเหตุ: ฟังก์ชันสตรีม read, write ฯลฯ เพิ่งเพิ่มใน MicroPython v1.3.4 เวอร์ชันก่อนหน้าใช้ uart.send และ uart.recv

คอนสตรักเตอร์

class pyb.UART(bus: int | str, *args, **kwargs)

สร้างออบเจกต์ UART บน bus ที่ระบุ (ดัชนีอุปกรณ์ต่อพ่วงเป็นจำนวนเต็ม เช่น 3 สำหรับ UART3) หากไม่มีพารามิเตอร์เพิ่มเติม ออบเจกต์จะถูกสร้างแต่ยังไม่ถูกกำหนดค่า (จะคงการตั้งค่าบัสก่อนหน้า ถ้ามี) หากมีอาร์กิวเมนต์เพิ่มเติม บัสจะถูกกำหนดค่า ดูพารามิเตอร์ที่ใช้ได้ได้ที่ init()

UART(3) ต่อสายกับพินส่วนหัวเดียวกันบน OpenMV Cam STM32 ทุกรุ่น:

สัญญาณ

พินส่วนหัว

TX

P4

RX

P5

บัส UART เพิ่มเติมมีให้ใช้งานบนบางบอร์ด:

บัส

พิน TX

พิน RX

ใช้ได้บน

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

เมธอด

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

กำหนดค่าบัส UART ด้วยพารามิเตอร์ที่ระบุ:

  • baudrate คืออัตราบอด

  • bits คือจำนวนบิตต่ออักขระ ได้แก่ 7, 8 หรือ 9

  • parity คือพาริตี ซึ่งเป็น None, 0 (คู่) หรือ 1 (คี่)

  • stop คือจำนวนสต็อปบิต ได้แก่ 1 หรือ 2

  • flow กำหนดประเภทของการควบคุมการไหลของข้อมูล สามารถเป็น 0, UART.RTS, UART.CTS หรือ UART.RTS | UART.CTS

  • timeout คือระยะหมดเวลาเป็นมิลลิวินาทีสำหรับรอการเขียน/อ่านอักขระแรก

  • timeout_char คือระยะหมดเวลาเป็นมิลลิวินาทีสำหรับรอระหว่างอักขระขณะเขียนหรืออ่าน

  • read_buf_len คือความยาวอักขระของบัฟเฟอร์อ่าน (0 เพื่อปิดใช้งาน)

เมธอดนี้จะเกิดข้อผิดพลาดหากไม่สามารถตั้งค่าอัตราบอดภายใน 5% ของค่าที่ต้องการได้

หมายเหตุ: เมื่อใช้ parity=None จะรองรับเฉพาะ 8 และ 9 บิตเท่านั้น เมื่อเปิดใช้พาริตี จะรองรับเฉพาะ 7 และ 8 บิตเท่านั้น

deinit() None

ปิดบัส UART

any() int

คืนค่าจำนวนไบต์ที่รออยู่ (อาจเป็น 0)

read(nbytes: int | None = None) bytes | None

อ่านอักขระ หาก nbytes ถูกระบุจะอ่านได้สูงสุดตามจำนวนนั้น หาก nbytes มีอยู่ในบัฟเฟอร์จะส่งคืนทันที ไม่เช่นนั้นจะส่งคืนเมื่ออักขระมาถึงเพียงพอหรือหมดเวลา

หากไม่ได้ระบุ nbytes เมธอดจะอ่านข้อมูลให้ได้มากที่สุด จะส่งคืนหลังจากหมดเวลา

หมายเหตุ: สำหรับอักขระ 9 บิต แต่ละอักขระใช้สองไบต์ nbytes ต้องเป็นเลขคู่ และจำนวนอักขระคือ nbytes/2

ค่าที่ส่งคืน: ออบเจกต์ bytes ที่มีไบต์ที่อ่านได้ คืนค่า None เมื่อหมดเวลา

readchar() int

รับอักขระเดี่ยวบนบัส

ค่าที่ส่งคืน: อักขระที่อ่านได้ในรูปแบบจำนวนเต็ม คืนค่า -1 เมื่อหมดเวลา

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

อ่านไบต์ลงใน buf หาก nbytes ถูกระบุจะอ่านได้สูงสุดตามจำนวนนั้น ไม่เช่นนั้นจะอ่านได้สูงสุด len(buf) ไบต์

ค่าที่ส่งคืน: จำนวนไบต์ที่อ่านและเก็บใน buf หรือ None เมื่อหมดเวลา

readline() bytes | None

อ่านบรรทัดหนึ่ง โดยสิ้นสุดที่อักขระขึ้นบรรทัดใหม่ หากมีบรรทัดดังกล่าวจะส่งคืนทันที หากหมดเวลา จะส่งคืนข้อมูลที่มีอยู่ทั้งหมดโดยไม่คำนึงถึงอักขระขึ้นบรรทัดใหม่

ค่าที่ส่งคืน: บรรทัดที่อ่านได้ หรือ None เมื่อหมดเวลาหากไม่มีข้อมูล

write(buf: bytes | bytearray | str) int | None

เขียนบัฟเฟอร์ไบต์ไปยังบัส หากอักขระมีความกว้าง 7 หรือ 8 บิต แต่ละไบต์คืออักขระหนึ่งตัว หากอักขระมีความกว้าง 9 บิต จะใช้สองไบต์ต่ออักขระหนึ่งตัว (little endian) และ buf ต้องมีจำนวนไบต์เป็นเลขคู่

ค่าที่ส่งคืน: จำนวนไบต์ที่เขียน หากเกิดการหมดเวลาและไม่มีไบต์ใดถูกเขียน จะคืนค่า None

writechar(char: int) None

เขียนอักขระเดี่ยวบนบัส char เป็นจำนวนเต็มที่จะเขียน ดูส่วน การควบคุมการไหล CTS ด้านล่างสำหรับพฤติกรรมการบล็อกเมื่อเปิดใช้งานการควบคุมการไหล CTS

sendbreak() None

ส่งสัญญาณ break บนบัส สัญญาณนี้จะทำให้บัสต่ำเป็นเวลา 13 บิต

ค่าคงที่

RTS: int

บิตแฟล็กสำหรับอาร์กิวเมนต์ flow ของ init() เปิดใช้งานการควบคุมการไหลของฮาร์ดแวร์ RTS (request-to-send) บนเส้นทางการรับ

CTS: int

บิตแฟล็กสำหรับอาร์กิวเมนต์ flow ของ init() เปิดใช้งานการควบคุมการไหลของฮาร์ดแวร์ CTS (clear-to-send) บนเส้นทางการส่ง สามารถ OR กับ RTS เพื่อเปิดใช้งานทั้งสองทิศทาง

การควบคุมการไหลของข้อมูล

UART(3) รองรับการควบคุมการไหลของฮาร์ดแวร์ RTS/CTS บน OpenMV Cam M7, H7, H7 Plus และ Pure Thermal พินการควบคุมการไหลคือ:

(TX, RX, nRTS, nCTS) = (P4, P5, P1, P2)

บน OpenMV Cam N6 มีเพียง nRTS เท่านั้นที่เปิดเผย (บนพินส่วนหัว P7) ส่วน nCTS ไม่ได้เชื่อมต่อกับส่วนหัว I/O

ในย่อหน้าต่อไปนี้ คำว่า "เป้าหมาย" หมายถึงอุปกรณ์ที่เชื่อมต่อกับ UART

เมื่อเรียกเมธอด init() ของ UART ด้วย flow ที่กำหนดเป็นหนึ่งหรือทั้งสองของ UART.RTS และ UART.CTS พินควบคุมการไหลที่เกี่ยวข้องจะถูกกำหนดค่า nRTS เป็นเอาต์พุต active-low และ nCTS เป็นอินพุต active-low ที่เปิดใช้งาน pull-up เพื่อต่อสายควบคุมการไหล ให้เชื่อมต่อ nCTS ของ OpenMV Cam กับ nRTS ของเป้าหมาย และ nRTS ของ OpenMV Cam กับ nCTS ของเป้าหมาย

CTS: เป้าหมายควบคุมตัวส่งสัญญาณของ OpenMV Cam

หากเปิดใช้งานการควบคุมการไหล CTS พฤติกรรมการเขียนจะเป็นดังนี้:

หากเรียกเมธอด UART.write(buf) ของ OpenMV Cam การส่งข้อมูลจะหยุดชะงักในช่วงที่ nCTS เป็น False ซึ่งจะส่งผลให้หมดเวลาหากบัฟเฟอร์ทั้งหมดไม่ได้รับการส่งภายในระยะหมดเวลา เมธอดจะคืนค่าจำนวนไบต์ที่เขียน ทำให้ผู้ใช้สามารถเขียนข้อมูลที่เหลือได้หากจำเป็น ในกรณีที่หมดเวลา อักขระจะค้างอยู่ใน UART รอ nCTS จำนวนไบต์ที่ประกอบเป็นอักขระนี้จะรวมอยู่ในค่าที่ส่งคืน

หากเรียก UART.writechar() เมื่อ nCTS เป็น False เมธอดจะหมดเวลา เว้นแต่เป้าหมายจะยืนยัน nCTS ทันเวลา หากหมดเวลา จะเกิดข้อผิดพลาด OSError 116 อักขระจะถูกส่งทันทีที่เป้าหมายยืนยัน nCTS

RTS: OpenMV Cam ควบคุมตัวส่งสัญญาณของเป้าหมาย

หากเปิดใช้งานการควบคุมการไหล RTS พฤติกรรมจะเป็นดังนี้:

หากใช้อินพุตแบบบัฟเฟอร์ (read_buf_len > 0) อักขระที่เข้ามาจะถูกบัฟเฟอร์ไว้ หากบัฟเฟอร์เต็ม อักขระถัดไปที่เข้ามาจะทำให้ nRTS เป็น False ซึ่งเป้าหมายควรหยุดการส่ง nRTS จะกลับเป็น True เมื่ออ่านอักขระออกจากบัฟเฟอร์

โปรดทราบว่าเมธอด any() จะคืนค่าจำนวนไบต์ในบัฟเฟอร์ สมมติว่าความยาวบัฟเฟอร์คือ N ไบต์ หากบัฟเฟอร์เต็มและมีอักขระเพิ่มเข้ามาอีก nRTS จะถูกตั้งเป็น False และ any() จะคืนค่าจำนวน N เมื่ออ่านอักขระออก อักขระเพิ่มเติมจะถูกวางในบัฟเฟอร์และจะรวมอยู่ในผลลัพธ์ของการเรียก any() ถัดไป

หากไม่ได้ใช้อินพุตแบบบัฟเฟอร์ (read_buf_len == 0) การมาถึงของอักขระจะทำให้ nRTS เป็น False จนกว่าจะมีการอ่านอักขระนั้น