คลาส 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 ทุกรุ่น:สัญญาณ
พินส่วนหัว
TXP4RXP5บัส UART เพิ่มเติมมีให้ใช้งานบนบางบอร์ด:
บัส
พิน TX
พิน RX
ใช้ได้บน
UART(1)P1P0OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal
UART(4)P2P3OpenMV Cam N6
UART(7)P14P13OpenMV 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 หรือ 9parityคือพาริตี ซึ่งเป็นNone, 0 (คู่) หรือ 1 (คี่)stopคือจำนวนสต็อปบิต ได้แก่ 1 หรือ 2flowกำหนดประเภทของการควบคุมการไหลของข้อมูล สามารถเป็น 0,UART.RTS,UART.CTSหรือUART.RTS | UART.CTStimeoutคือระยะหมดเวลาเป็นมิลลิวินาทีสำหรับรอการเขียน/อ่านอักขระแรกtimeout_charคือระยะหมดเวลาเป็นมิลลิวินาทีสำหรับรอระหว่างอักขระขณะเขียนหรืออ่านread_buf_lenคือความยาวอักขระของบัฟเฟอร์อ่าน (0 เพื่อปิดใช้งาน)
เมธอดนี้จะเกิดข้อผิดพลาดหากไม่สามารถตั้งค่าอัตราบอดภายใน 5% ของค่าที่ต้องการได้
หมายเหตุ: เมื่อใช้ parity=None จะรองรับเฉพาะ 8 และ 9 บิตเท่านั้น เมื่อเปิดใช้พาริตี จะรองรับเฉพาะ 7 และ 8 บิตเท่านั้น
- 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
ค่าคงที่¶
การควบคุมการไหลของข้อมูล¶
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 จนกว่าจะมีการอ่านอักขระนั้น