class UART -- ناقل اتصالات تسلسلية ثنائي الاتجاه#

ينفّذ UART بروتوكول الاتصالات التسلسلية ثنائية الاتجاه القياسي UART/USART. على المستوى الفيزيائي يتكوّن من خطين: RX وTX. وحدة الاتصال هي محرف (لا يُخلط بينه وبين محرف السلسلة النصية) يمكن أن يكون بعرض 8 أو 9 بتات.

يمكن إنشاء كائنات UART وتهيئتها باستخدام:

from machine import UART

uart = UART(3, 9600)                         # init with given baudrate
uart.init(9600, bits=8, parity=None, stop=1) # init with given parameters

يمكن أن تكون البتات 7 أو 8 أو 9. ويمكن أن يكون التوقّف 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

المُنشئات#

class machine.UART(id: int, baudrate: int = 9600, bits: int = 8, parity: int | None = None, stop: int = 1, *, tx: Pin | None = None, rx: Pin | None = None, rts: Pin | None = None, cts: Pin | None = None, txbuf: int | None = None, rxbuf: int | None = None, timeout: int | None = None, timeout_char: int | None = None, invert: int = 0, flow: int = 0)#

إنشاء كائن UART بالمعرّف المُعطى.

الأساليب#

init(baudrate: int = 9600, bits: int = 8, parity: int | None = None, stop: int = 1, *, tx: Pin | None = None, rx: Pin | None = None, rts: Pin | None = None, cts: Pin | None = None, txbuf: int | None = None, rxbuf: int | None = None, timeout: int | None = None, timeout_char: int | None = None, invert: int = 0, flow: int = 0) None#

تهيئة ناقل UART بالمعاملات المُعطاة:

  • baudrate هو معدل الساعة.

  • bits هو عدد البتات لكل محرف، 7 أو 8 أو 9.

  • parity هو التماثل، None أو 0 (زوجي) أو 1 (فردي).

  • stop هو عدد بتات التوقّف، 1 أو 2.

المعاملات الإضافية المخصّصة للكلمات المفتاحية فقط والتي قد تدعمها المنفذ هي:

  • tx يحدّد دبوس TX المراد استخدامه.

  • rx يحدّد دبوس RX المراد استخدامه.

  • rts يحدّد دبوس RTS (الخرج) المراد استخدامه للتحكم في تدفق الاستقبال عبر العتاد.

  • cts يحدّد دبوس CTS (الدخل) المراد استخدامه للتحكم في تدفق الإرسال عبر العتاد.

  • txbuf يحدّد طول مخزن TX المؤقت بالمحارف.

  • rxbuf يحدّد طول مخزن RX المؤقت بالمحارف.

  • timeout يحدّد زمن انتظار المحرف الأول (بالميلي ثانية).

  • timeout_char يحدّد زمن الانتظار بين المحارف (بالميلي ثانية).

  • invert يحدّد الخطوط المراد عكسها.

    • 0 لن يعكس الخطوط (حالة الخمول لكلا الخطين هي منطقي مرتفع).

    • UART.INV_TX سيعكس خط TX (تصبح حالة خمول خط TX الآن منطقي منخفض).

    • UART.INV_RX سيعكس خط RX (تصبح حالة خمول خط RX الآن منطقي منخفض).

    • UART.INV_TX | UART.INV_RX سيعكس كلا الخطين (حالة الخمول عند منطقي منخفض).

  • flow يحدّد إشارات التحكم في التدفق عبر العتاد المراد استخدامها. القيمة هي قناع بتات.

    • 0 سيتجاهل إشارات التحكم في التدفق عبر العتاد.

    • UART.RTS سيفعّل التحكم في تدفق الاستقبال باستخدام دبوس خرج RTS للإشارة إلى ما إذا كان لدى مخزن FIFO الخاص بالاستقبال مساحة كافية لقبول مزيد من البيانات.

    • UART.CTS سيفعّل التحكم في تدفق الإرسال عبر إيقاف الإرسال مؤقتًا عندما يشير دبوس دخل CTS إلى أن مساحة المخزن المؤقت لدى جهاز الاستقبال آخذة في النفاد.

    • UART.RTS | UART.CTS سيفعّل كليهما، للتحكم الكامل في التدفق عبر العتاد.

ملاحظة

من الممكن استدعاء init() عدة مرات على الكائن نفسه من أجل إعادة تهيئة UART أثناء التشغيل. وهذا يتيح استخدام طرفية UART واحدة لخدمة أجهزة مختلفة متصلة بدبابيس GPIO مختلفة. ويمكن خدمة جهاز واحد فقط في كل مرة في تلك الحالة. كما يجب عدم استدعاء deinit() لأنه سيمنع استدعاء init() مرة أخرى.

deinit() None#

إيقاف تشغيل ناقل UART.

ملاحظة

لن تتمكن من استدعاء init() على الكائن بعد deinit(). يلزم إنشاء نسخة جديدة في تلك الحالة.

any() int#

يُرجع عددًا صحيحًا يحصي عدد المحارف التي يمكن قراءتها دون حجب. سيُرجع 0 إذا لم تكن هناك محارف متاحة وعددًا موجبًا إذا كانت هناك محارف. قد يُرجع الأسلوب 1 حتى لو كان هناك أكثر من محرف واحد متاح للقراءة.

للاستعلام الأكثر تطورًا عن المحارف المتاحة استخدم select.poll:

poll = select.poll()
poll.register(uart, select.POLLIN)
poll.poll(timeout)
read(nbytes: int | None = None, /) bytes | None#

قراءة المحارف. إذا حُدّد nbytes فاقرأ بحدٍّ أقصى ذلك العدد من البايتات، وإلا فاقرأ أكبر قدر ممكن من البيانات. وقد يعود الأسلوب أبكر إذا بلغ زمن الاستجابة حدّه. زمن الاستجابة قابل للضبط في المُنشئ.

القيمة المُرجعة: كائن bytes يحتوي على البايتات التي قُرئت. يُرجع None عند انتهاء المهلة.

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

قراءة البايتات إلى buf. إذا حُدّد nbytes فاقرأ بحدٍّ أقصى ذلك العدد من البايتات. وإلا فاقرأ بحدٍّ أقصى len(buf) بايت. وقد يعود الأسلوب أبكر إذا بلغ زمن الاستجابة حدّه. زمن الاستجابة قابل للضبط في المُنشئ.

القيمة المُرجعة: عدد البايتات التي قُرئت وخُزّنت في buf أو None عند انتهاء المهلة.

readline() bytes | None#

قراءة سطر ينتهي بمحرف سطر جديد. وقد يعود الأسلوب أبكر إذا بلغ زمن الاستجابة حدّه. زمن الاستجابة قابل للضبط في المُنشئ.

القيمة المُرجعة: السطر الذي قُرئ أو None عند انتهاء المهلة.

write(buf: bytes) int | None#

كتابة مخزن البايتات المؤقت إلى الناقل.

القيمة المُرجعة: عدد البايتات التي كُتبت أو None عند انتهاء المهلة.

sendbreak() None#

إرسال حالة قطع (break) على الناقل -- إبقاء TX منخفضًا لمدة أطول من زمن محرف واحد. متاح على STM32 وmimxrt؛ وغير متاح على alif.

readchar() int#

قراءة محرف واحد من UART وإرجاعه كعدد صحيح (أو -1 عند انتهاء المهلة). أقل عبئًا من read(1) لأنه لا يُخصَّص كائن bytes. على STM32 فقط.

writechar(char: int) None#

كتابة المحرف الواحد char (عدد صحيح في النطاق 0 -- 255) إلى UART. أقل عبئًا من write() للإرسالات أحادية البايت. على STM32 فقط.

flush() None#

الحجب حتى يخرج كل بايت موجود حاليًا في مخزن الإرسال المؤقت عبر TX. يطلق OSError عند انتهاء المهلة؛ تُشتق المهلة من حجم مخزن TX المؤقت ومعدل الباود المضبوط، لذا فما لم يكن التحكم في التدفق مفعّلًا ويتوقف جهاز الاستقبال، يعود الاستدعاء قبل انتهاء المهلة بكثير.

txdone() bool#

يُرجع True عندما لا يكون هناك إرسال جارٍ (مخزن TX المؤقت فارغ وقد فرغ سجل الإزاحة)، وFalse خلاف ذلك. مفيد كبديل غير حاجب عن flush().

irq(handler: Callable[[UART], None] | None = None, trigger: int = 0, hard: bool = False) None#

تثبيت دالة رد نداء لإطلاقها عند أحداث UART.

handler هي الدالة المراد استدعاؤها. تتلقى نسخة UART كوسيطها الوحيد. مرّر None لإزالة معالج مُثبّت سابقًا.

trigger هو قناع بتات لواحد أو أكثر من ثوابت IRQ_* (انظر الثوابت أدناه) يحدّد أي الأحداث يطلق دالة رد النداء.

hard=True يسجّل معالج مقاطعة صلبة (زمن استجابة أقل، ولكن يجب ألا يخصّص المعالج ذاكرة). الافتراضي هو دالة رد نداء مجدولة.

يُرجع كائن irq.

ليس كل مصدر IRQ متاحًا على كل منفذ -- انظر ثوابت IRQ_* الفردية لمعرفة التوفر لكل منفذ.

الثوابت#

RTS: int#

مرّر إلى flow لتفعيل التحكم في تدفق العتاد RTS على جانب الاستقبال. ادمجه مع CTS عبر OR لتفعيل كليهما.

CTS: int#

مرّر إلى flow لتفعيل التحكم في تدفق العتاد CTS على جانب الإرسال.

IRQ_RXIDLE: int#

علامة إطلاق irq() : تُطلق مرة واحدة بعد استقبال محرف واحد أو أكثر ثم انتقال خط RX إلى الخمول. متاحة على جميع منافذ OpenMV.

IRQ_RX: int#

علامة إطلاق irq() : تُطلق بعد كل محرف مُستقبَل. متاحة على STM32 وalif.

IRQ_TXIDLE: int#

علامة إطلاق irq() : تُطلق عند خروج آخر محرف من الإرسال عبر الساعة. متاحة على mimxrt وalif.

IRQ_BREAK: int#

علامة إطلاق irq() : تُطلق عند كشف حالة قطع (break) على RX. غير متاحة على أي منفذ من منافذ OpenMV.