class UART -- ناقل اتصال تسلسلي مزدوج الاتجاه¶
ينفّذ UART بروتوكول الاتصالات التسلسلية المزدوجة القياسي UART/USART. على المستوى الفيزيائي يتكوّن من خطين: 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. يمكن أن يكون التماثل (Parity) None أو 0 (زوجي) أو 1 (فردي). يمكن أن يكون Stop بقيمة 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 أو 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 بتات فقط.
- 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 بتات فيُستخدم بايتان لكل حرف (ترتيب البايت الأصغر أولًا)، ويجب أن يحتوي
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 فغير موصول إلى ترويسة الإدخال/الإخراج.
في الفقرات التالية يشير المصطلح "الهدف" إلى الجهاز الموصول بـ UART.
عند استدعاء أسلوب init() الخاص بـ UART مع ضبط flow على واحد أو كلا القيمتين UART.RTS وUART.CTS، تُهيّأ دبابيس التحكم في التدفق ذات الصلة. nRTS هو خرج نشِط عند المستوى المنخفض وnCTS هو دخل نشِط عند المستوى المنخفض مع تمكين المقاومة الرافعة. لتوصيل التحكم في التدفق، صِل 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 حتى تتم قراءة الحرف.