مقدمة
الإلكترونيات المدمجة (Embedded electronics) هي عبارة عن دوائر إلكترونية مترابطة معاً (مُعالجات (processors) أو دوائر متكاملة (integrated circuits) أخرى) لإنشاء نظام تكافلي (symbiotic system). ولجعل تلك الدوائر تتبادل المعلومات مع بعضها البعض لا بد أن تتشارك في بروتوكول اتصال (communication protocol) مشترك. هناك المئات من بروتوكولات الاتصال تستطيع القيام بمهمة تبادل البيانات تلك، وبوجه عام يُمكن تقسيم تلك البروتوكولات إلى نوعين: تسلسلية (serial) ومتوازية (parallel).
الاتصال التسلسلي والاتصال المتوازي
الواجهات المتوازية تقوم بنقل عدة بتات (bits) في نفس الوقت. وهي في العادة تتطلب نواقل (buses) بيانات تستخدم عدد أسلاك يبلغ ثمانية أو ستة عشر أو أكثر، ويتم نقل البيانات في أمواج ضخمة متلاطمة من القيمتين 0 و1.
ناقل بيانات 8 بت (8-bit data bus) يتم التحكم فيه باستخدام ساعة (clock) بحيث يقوم بنقل بايت (byte) خلال كل نبضة من نبضات الساعة. ويتم استخدام تسعة أسلاك.
أما الواجهات التسلسلية فتقوم بنقل البيانات بت تلو الآخر. هذه الواجهات يُمكن أن تعمل باستخدام عدد قليل من الأسلاك يصل إلى سلك واحد وعادة لا يتجاوز أربعة أسلاك.
مثال على واجهة تسلسلية، تقوم بنقل بت واحد كل نبضة ساعة (clock pulse)، ولا يتطلب الأمر سوى سلكين فقط.
تخيل أن نوعي الاتصال (التسلسلي والمتوازي) عبارة عن طريق للسيارات: في الاتصال المتوازي يكون الطريق يحتوي على ثمان مسارات (lanes)، بينما في الاتصال التسلسلي يكون الطريق ريفي ضيق يحتوي على مسارين فقط. على مدى فترة معينة من الزمن يستطيع الطريق الواسع ذو الثمان مسارات إيصال عدد أكبر من السيارات، لكن في الوقت ذاته يؤدي الطريق الريفي ذو المسارين نفس الغرض، ولا يكلف سوى جزء صغير من تكلفة الطريق الواسع.
الاتصال المتوازي له بالتأكيد مميزات، فهو سريع ومستقيم ويسهل تطبيقه. لكنه يتطلب الكثير من خطوط الإدخال (input) والإخراج (output) ((I/O) lines). إذا سبق لك من قبل نقل أحد المشاريع من لوح أردوينو أونو (Arduino Uno) إلى أردوينو ميجا (Mega) فستدرك أن خطوط الإدخال والإخراج الخاصة بالمتحكم الدقيق (microprocessor) قليلة ولها أهمية كبيرة. لذلك نلجأ غالباً لاستخدام الاتصال التسلسلي مضحين ببعض السرعة في سبيل توفير بعض المنافذ.
الاتصال التسلسلي غير المتزامن (Asynchronous Serial)
على مدى سنوات عديدة تم ابتكار الكثير من بروتوكولات الاتصال التسلسلي لتناسب الاحتياجات الخاصة بالأنظمة المدمجة. الناقل التسلسلي العالمي USB (universal serial bus)، والإيثرنت (Ethernet) هما مثالان على الواجهات التسلسلية الأكثر شهرة في عالم الكمبيوتر. هناك أيضاً واجهات تسلسلية أخرى ذات شهرة كبيرة مثل SPI وI2C والاتصال التسلسلي القياسي الذي سنتحدث عنه في هذا الدرس. كل من هذه الواجهات التسلسلية يُمكن تقسيمها إلى فئتين: متزامنة (synchronous)، وغير متزامنة (asynchronous).
دائماً ما تحتوي الواجهات التسلسلية المتزامنة على إشارة ساعة بالإضافة إلى خط (خطوط) البيانات، لذلك فإن جميع الأجهزة المتصلة بناقل تسلسلي متزامن تتشارك في ساعة مشتركة. وهذا يساعد في تبسيط وتسريع النقل التسلسلي، ولكنه يتطلب سلك واحد إضافي على الأقل بين الأجهزة المتصلة. تتضمن الأمثلة على الواجهات المتزامنة SPI وI2C.
أما في الواجهات غير المتزامنة، يتم نقل البيانات بدون الاستعانة بإشارة ساعة خارجية. وهذه الطريقة هي الأمثل لتقليل عدد الأسلاك المطلوبة ومنافذ الدخل والخرج المستخدمة، ولكن هذا يعني الحاجة لبذل المزيد من المجهود لنقل واستقبال البيانات بصورة موثوقة. البروتوكول التسلسلي الذي سنناقشه في هذا الدرس هو الشكل الأكثر شيوعاً للاتصال التسلسلي غير المتزامن. فهو منتشر لدرجة أنه عندما يقول أحد ما “اتصال تسلسلي” فإنه في الغالب يقصد ذلك البروتوكول.
بروتوكول الاتصال التسلسلي الذي لا يتضمن ساعة والذي سنناقشه خلال هذا الدرس يُستخدم على مدى واسع في الإلكترونيات المدمجة. إذا كنت تتطلع لإضافة وحدة GPS أو Bluetooth أو XBee أو شاشات LCD تسلسلية أو العديد من الأجهزة الخارجية إلى مشروعك فستحتاج للتعرف بشكل أكبر على الاتصال التسلسلي.
مواضيع مقترحة للقراءة
هذا الدرس مبني على معرفة مسبقة ببعض مفاهيم الإلكترونيات والتي تشمل:
- كيفية قراءة المخططات (قريباً)
- الرقمية والتناظرية
- النظام الثنائي
- النظام السداسي العشري
- أسكي
إذا لم تكن على اطلاع على أي من تلك المفاهيم فيجب عليك قراءة الدروس أولاً، وبعد ذلك دعونا ننطلق في رحلتنا في عالم الاتصال التسلسلي.
قواعد الاتصال التسلسلي
بروتوكول الاتصال التسلسلي الغير متزامن يتضمن عدداً من القواعد والآليات مدمجة به تساعد في ضمان نقل البيانات بشكل سليم وخالي من الاخطاء. هذه الآليات (التي نستعين بها لعدم استخدام إشارة ساعة خارجية) هي:
- بتات البيانات (Data bits)
- بتات المزامنة (Synchronization bits)
- بتات التكافؤ (Parity bits)
- معدل بود (Baud rate)
بسبب تنوع آليات إرسال الإشارات تلك فليست هناك طريقة واحدة معينة لإرسال البيانات تسلسلياً، بل البروتوكول قابل لإعادة التشكيل بشكل كبير. الجزء المهم هنا هو التأكد من أن كلا الجهازين المتصلين بالناقل التسلسلي مُعدان لاستخدام نفس البروتوكولات بالضبط.
معدل بود (Baud rate)
يُحدد معدل بود سرعة إرسال البيانات عبر الخط التسلسلي، وغالباً ما يُعبر عنه بوحدة بت/ثانية (bps). وإذا قمنا بقلب معدل بود نحصل على المدة المُستغرقة لنقل بت واحد فقط. وهذه القيمة تحدد المدة التي يُبقي فيها المُرسل الخط التسلسلي في حالة مرتفعة (high)/منخفضة (low).
معدل بود يُمكن أن يكون أي قيمة مُمكنة. والشيء الوحيد المطلوب هو أن يعمل كلا الجهازين بنفس المعدل. من معدلات بود الأكثر انتشاراً –وخاصة في الأجهزة البسيطة التي لا تتطلب سرعة كبيرة- هو 9600bps. ومن المعدلات القياسية الأخرى 1200 و2400 و4800 و19200 و34800 و57600 و115200.
كلما ارتفعت قيمة مُعدل بود زادت سرعة إرسال/استقبال البيانات، لكن هناك حدود للسرعة التي يُمكن عبرها تقل البيانات. فغالباً لن ترى سرعات تتجاوز 115200. فزيادة السرعة بدرجة كبيرة للغاية يُسبب حدوث أخطاء في الطرف المستقبل لأن السعة ومدد أخذ العيّنات (sampling periods) لا تستطيع التكيف مع ذلك.
تأطير البيانات (Framing the data)
كل مجموعة (block) (عادة ما تكون بايت) من البيانات يتم نقلها في الواقع عبر حزمة (packet) أو إطار (frame) من البتات. ويتم إنشاء الإطارات عن طريق إلحاق بتات التكافؤ والمزامنة بالبيانات الخاصة بنا.
إطار تسلسلي. بعض محتويات هذا الإطار يُمكن تغيير حجم البتات الخاص بها.
دعونا نتناول بالتفصيل كل من مكونات الإطار تلك.
كتلة البيانات (data chunk)
الجزء الحيوي والأهم في كل حزمة اتصال تسلسلي هي البيانات التي تحملها. ويُستخدم مُصطلح الكتلة لأن حجم البيانات لا يكون مُحدداً بدقة. فكمية البيانات التي تحتويها أي حزمة يُمكن أن تتراوح بين 5 و9 بتات. في الواقع الحجم القياسي للبيانات هو البايت الذي يحتوي على ثمانية بتات، لكن هناك أحجام أخرى لها استخدامات خاصة بها. فمثلاً كتلة البيانات المُكونة من سبعة بتات أفضل من المكونة من ثمانية بتات، خاصة في حالة نقل أحرف أسكي (ASCII) ذات السبعة بتات.
بعد تحديد طول الحرف يجب أن يتفق كلا الجهازين التسلسليين في ترتيب البيانات (endianness) الخاصة بهما. ترتيب البيانات يوضح كيفية نقل البيانات: هل يتم نقلها من البت الأكثر أهمية (most-significant bit (msb)) للأقل أم العكس؟ إذا لم يكن ذلك موضحاً يُمكننا الافتراض أن البيانات يتم نقلها من البت الأقل أهمية (least-significant bit (lsb)) للأكبر.
بتات المزامنة (Synchronization bits)
بتات المزامنة هي عبارة عن بتات خاصة عددها اثنين أو ثلاثة يتم نقلها مع كل كتلة من كتل البيانات. وهي عبارة عن بت البداية (start bit) وبت(ات) التوقف (stop bit(s)). تقوم تلك البتات -كما يبدو من أسماءها – بتحديد بداية ونهاية الحزمة. دائماً يكون هناك بت بداية واحد، لكن عدد بتات التوقف يُمكن جعله واحد أو اثنين (في الغالب يتم تركه واحد).
يتم الرمز للبداية دائماً ببت ذي حالة منخفضة (0)، بينما يُرمز للتوقف ببت ذي حالة مرتفعة (1).
بتات التكافؤ (Parity bits)
بتات التكافؤ هي عبارة عن فحص بسيط وبدائي للأخطاء. والتكافؤ له نوعان: إما فردي (odd) أو زوجي (even). لإنشاء بت التكافؤ يتم جمع جميع البتات (بين 5-9) الموجود ببايت البيانات ومن ثم تُحدد قيمة المجموع قيمة بت التكافؤ (1 أو 0). على سبيل المثال إذا كان التكافؤ زوجي وكان بايت البيانات هو 0b01011101 والذي يحتوي على عدد فردي من القيمة 1 (خمسة)، عندها تكون قيمة بت التكافؤ 1. في المقابل إذا كان التكافؤ فردي فإن قيمة بت التكافؤ تكون في هذه الحالة 0.
استخدام التكافؤ اختياري، وفي الواقع لا يستخدم بشكل كبير. من الممكن أن يساعد في نقل البيانات خلال الأوساط ذات الضجيج (noisy mediums)، لكن ذلك سيؤدي إلى إبطاء نقل البيانات، كما سيتطلب أن يقوم كل من المُرسل والمستقبل بمعالجة الأخطاء (في الغالب يكون لا بد من إعادة إرسال البيانات التي حدث خطأ في استقبالها).
بروتوكول 9600 8N1 (مثال)
بروتوكول 9600 8N1 يحتوي على 8 بتات، ومعدل بود له 9600، ويحتوي على بت توقف وحيد ولا يستخدم التكافؤ. وهو من أكثر البروتوكولات التسلسلية شيوعاً. إذاً كيف تبدو حزم البيانات الخاصة ببروتوكول 9600 8N1؟ دعونا نطلع على مثال.
في حالة وجود جهاز يقوم بنقل حرفي “O” و “K” من حروف أسكي يجب إنشاء حزمتي بيانات. قيمة حرف O (كبير) في أسكي هي 79، والتي يتم تمثيلها ثنائياً في ثمانية بتات لتكون 01001111، بينما “K” يتم تمثيله ثنائياً 01001011. لم يتبقى الآن سوى إضافة بتات المزامنة.
لاحظ أننا فرضنا هنا إرسال البت الأقل في الأهمية أولاً. وفي هذه الحالة يتم إرسال كل بايت كما هو مكتوب من اليمين لليسار.
سرعة نقل البيانات في هذا البروتوكول هي 9600 bps، لذلك يكون الوقت المستغرق لجعل كل بت من هذه البتات في حالة مرتفعة أو منخفضة هو 1/9600 ثانية (104 µs).
كل بايت يتم إرسال البيانات من خلاله يحتوي على عشرة بتات: بت للبداية، ثمانية بتات بيانات، وبت للتوقف. لذلك وبسبب أن معدل بود 9600 فإننا يُمكننا القول إنه يتم إرسال 9600 بت أو 960 (9600/10) بايت في كل ثانية.
والآن بعد أن تعرفنا على تركيب حزم الاتصال التسلسلي يُمكننا أن ننتقل إلى الجزء الخاص بالعتاد. سنتعرف الآن كيف نحصل على قيم 1 و0 وكيف يتم احتساب معدل بود.
التوصيلات والعتاد (Wiring and Hardware)
يتكون ناقل البيانات التسلسلي من سلكين فقط -واحد لإرسال البيانات وآخر لاستقبالها. لذلك تحتوي الأجهزة التسلسلية على منفذين تسلسليين: المُستقبل (receiver) ويُختصر RX، والمرسل (transmitter) ويُختصر TX.
عند التوصيل بين جهازين تسلسلياً يجب أن يتم توصيل منفذ RX في أحد الجهازين بمنفذ TX في الجهاز الآخر والعكس صحيح. قد تشعر بأن هذا أمر غريب لأننا سابقاً اعتدنا على توصيل المنافذ المتشابهة معاً مثل توصيل بمنفذ VCC بـ VCC وتوصيل منفذ GND بـ GND وهكذا، لكن إذا فكرت في الأمر هذه المرة فستجد أنه منطقي. فالمُرسل يجب أن يتصل بالمستقبل وليس بمرسل آخر.
الواجهة التسلسلية التي تحتوي على جهازين يستطيع كل منهما إرسال واستقبال البيانات تكون إما ثنائية الاتجاه (full-duplex) أو أحادية الاتجاه (half-duplex). في الواجهات ثنائية الاتجاه يستطيع كلا الجهازين الإرسال والاستقبال في نفس الوقت، بينما في الواجهات أحادية الاتجاه يتناوب الجهازان في الإرسال والاستقبال ولا تتم العمليتان في ذات الوقت.
بعض النواقل التسلسلية تحتوي على سلك اتصال واحد بين جهاز مُرسل وجهاز مُستقبل. على سبيل المثال شاشات LCD التسلسلية تقوم باستقبال البيانات فقط ولا تقوم بإرسال أي بيانات إلى جهاز التحكم. وهذا ما يُطلق عليه الاتصال التسلسلي البسيط (simplex serial communication). وكل ما تحتاجه في هذه الحالة سلك وحيد يصل بين منفذ TX في جهاز التحكم بمنفذ RX في الجهاز المُستقبل.
تنفيذ العتاد (Hardware Implementation)
قمنا بتناول الاتصال التسلسلي الغير متزامن من الناحية النظرية. نحن الآن نعرف الأسلاك التي نحتاج إليها. لكن كيف يتم تنفيذ الاتصال التسلسلي على مستوى الإشارات؟ في الواقع هذا يتم بعدة طرق. هناك الكثير من معايير (standards) إرسال الإشارات التسلسلية. دعونا نتناول اثنين من أشهر تلك الواجهات: المستوى المنطقي (logic-level (TTL)) وRS-232.
عندما تتصل المُتحكمات الدقيقة والدوائر المتكامل ذات المستوى المنخفض (low-level ICs) تسلسلياً فغالباً ما تقوم بذلك على مستوى منطق الترانزستور– ترانزستور (transistor-transistor logic (TTL)). إشارات TTL التسلسلية تقع في مدى مصدر الجهد الخاص بالمًتحكم الدقيق – غالباً بين 0V و3.3V أو 5V. الإشارة التي تساوي قيمة VCC (3.3V أو 5V أو غير ذلك) تٌشير إلى خط ساكن (idle line)، أو بت بيانات قيمته 1 أو بت توقف. بينما الإشارة التي تساوي قيمتها 0V (GND) تمثل إما بت بداية أو بت بيانات قيمته 0.
واجهة RS-232 التسلسلية التي توجد في أجهزة الكمبيوتر القديمة والأجهزة الطرفية تشبه واجهة TTL مقلوبة رأساً على عقب. في الغالب تتراوح قيمة إشارات واجهة RS-232 بين -13V و 13V بالرغم من أنها تسمح بأي قيمة بين +/- 3V و +/- 25V. في هذه الإشارات يُشير الجهد المنخفض (-5V، -13V، الخ) إلى خط ساكن أو بت توقف أو بت بيانات قيمته 1. أما الإشارة المرتفعة (الموجبة) في واجهة RS-232 فتشير إلى إما بت بداية أو بت بيانات قيمته 0. أي أن هذه الواجهة معاكسة تماماً لواجهة TTL التسلسلية.
من بين هاتين الواجهتين التسلسليتين تُعتبر واجهة TLL أسهل بكثير في التنفيذ بالدوائر الإلكترونية المُدمجة. لكن مستويات الجهد المنخفضة أكثر عرضة للفقد البيانات خلال خطوط النقل الطويلة. معيار RS-232 أو المعايير الأكثر تعقيداً مثل RS-485 تتناسب بشكل أفضل مع خطوط النقل التسلسلي الطويلة.
عندما تقوم بتوصيل جهازين تسلسليين معاً من المهم للغاية أن تتأكد أن جهود الإشارات الخاصة بهما متوافقة. فمثلاً لا تستطيع توصيل جهاز يعمل بواجهة TLL بجهاز آخر ذي ناقل بواجهة RS-243 مباشرة، وسيكون عليك تعديل تلك الإشارات (shift those signals).
سنستمر في درسنا هذا وسنشرح الأداة التي تستخدمها المُتحكمات الدقيقة لتحويل بياناتها الموجودة في ناقل متوازي (parallel bus) من وإلى الواجهات التسلسلية. المرسل/المُستقبل العالمي الغير تزامني (UART).
المرسل/المُستقبل العالمي الغير تزامني (universal asynchronous receiver/transmitter) (UART)
الجزء الأخير فيما يتعلق بالواجهات التسلسلية هو العثور على شيء يستطيع إنشاء الحزم التسلسلية والتحكم في خطوط العتاد المادي. المرسل/المُستقبل العالمي الغير تزامني (UART).
المرسل/المُستقبل العالمي الغير تزامني (UART) هو عبارة عن دائرة إلكترونية مسئولة عن تنفيذ الاتصال التسلسلي. في الأساس يعمل UART كوسيط بين الواجهات التسلسلية والمتوازية. في أحد نهايتي UART يوجد ناقل يحتوي على ثمانية خطوط بيانات أو نحو ذلك (بالإضافة لبعض منافذ التحكم (control pins))، وفي النهاية الأخرى يوجد منفذين تسلسليين RX و TX.
واجهة UART مُبسطة للغاية. لاحظ وجود ناقل متوازي في أحد الجانبين، وناقل تسلسلي في الجانب الآخر.
يُمكن أن توجد دوائر UART كدوائر متكاملة مستقلة، لكنها في الغالب توجد بداخل المتحكمات الدقيقة. يجب أن تقوم بقراءة صحيفة البيانات (datasheet) الخاصة بالمُتحكم الدقيق الذي لديك لمعرفة ما إذا كان يحتوي على UART. بعض المُتحكمات الدقيقة لا تحتوي على UART، وبعضها يحتوي على واحد، والبعض يحتوي على أكثر من ذلك. على سبيل المثال تحتوي بطاقة أردوينو أونو (Arduino Uno) المحتوية على المُتحكم الدقيق ATmega328 على UART واحد، بينما بطاقة أردوينو ميجا (Arduino Mega) المُحتوية على المتحكم الدقيقATmega2560 تحتوي على أربعة UART.
المرسل/المُستقبل العالمي الغير تزامني (UART) –كما يبدو من اسمه- مسئول عن إرسال واستقبال البيانات التسلسلية. ففيما يتعلق بالإرسال يقوم UART بإنشاء حزم البيانات ويضيف إليها بتات المزامنة والتكافؤ، ثم يقوم بإرسال تلك الحزم عبر خط TX بتوقيت دقيق (طبقاً لمُعدل بود المُحدد). أما فيما يتعلق بالاستقبال يقوم UART باستقبال الإشارات الآتية على خط RX بمُعدل طبقاً لمُعدل بود المتوقع، مع تحديد بتات المُزامنة واستخراج البيانات.
رسم تخطيطي للمكونات الداخلية لـ UART
دوائر UART الأكثر تطوراً تقوم بإدخال البيانات التي تستقبلها إلى ذاكرة وسيطة (buffer) حيث تبقى بداخلها إلى أن يلتقطها المُتحكم الدقيق. وتقوم دوائر UART بإخراج البيانات التي تختزنها بمبدأ من يأتي أولاً يخرج أولاً (first-in-first-out (FIFO)). من المُمكن أن تكون الذاكرة الوسيطة صغيرة للغاية لا تتعدى بضعة بتات، ومن الممكن أن تكون كبيرة لتبلغ آلاف البايتات.
المرسل/المُستقبل العالمي الغير تزامني البرمجي (Software UART)
إذا لم يكن المُتحكم الدقيق يحتوي على UART (أو كان يحتوي على عدد أقل من المطلوب) يُمكن أن يتم استخدام تقسيم البت (Bit-banging) للواجهة التسلسلية، والذي يتم التحكم به بواسطة المُعالج (processor) مباشرة. وهذا هو الأسلوب الذي تتبعه مكتبات أردوينو مثل SoftwareSerial. تقسيم البت يستهلك المُعالج وفي الغالب لا تصل دقته لـ UART، لكنه يفي بالغرض إلى حد ما.
أخطاء شائعة
تحدثنا عن كل ما يتعلق بالاتصال التسلسلي. أود أن أترككم مع بعض الأخطاء الشائعة التي يُحتمل أن يقع فيها أي شخص مُهتم بالإلكترونيات مهما بلغت خبرته.
توصيل RX بـ TX وTX بـ RX
يبدو أمراً بسيطاً، لكنه خطأ سهل الوقوع فيه. تأكد دائماً من توصيل خط RX بخط TX بين الأجهزة التسلسلية.
بطاقة Pro Mini. لاحظ توصيل منفذ RX بـ TX.
عدم تطابق مُعدل بود
مُعدل بود يشبه اللغة التي تتحدث بها الاتصالات التسلسلية. إذا لم يكن الجهازان يتحدثان بنفس اللغة، فإما أن تحدث أخطاء في تفسير البيانات أو تُفقد بشكل تام. تأكد دائماً من أن مُعدل بود للأجهزة التسلسلية التي تقوم بتوصيلها معاً متماثل.
بيانات يتم إرسالها بمعدل 9600bps، ولكن يتم استقبالها بمُعدل 19200bps. عدم تطابق معدل بود = بيانات مفقودة
منافسة الناقل (Bus Contention)
تم تصميم الاتصال التسلسلي للسماح لجهازين فقط بالاتصال عبر ناقل تسلسلي واحد. وإذا حاول أكثر من جهاز واحد الإرسال على نفس الخط التسلسلي يُمكن أن يتسبب ذلك فيما يُعرف بمنافسة الناقل (bus-contention).
على سبيل المثال إذا أردت بتوصيل وحدة GPS ببطاقة أردوينو فستقوم بتوصيل خط TX الخاص بالوحدة بخط RX على بطاقة الأردوينو. لكن منفذ RX الخاص ببطاقة الأردوينو مُتصلة بالفعل من قبل بمنفذ TX الخاص بالمحول من USB إلى تسلسلي (USB-to-serial converter) الذي يُستخدم عند الحاجة لبرمجة بطاقة الأردوينو أو استخدام الشاشة التسلسلية (Serial Monitor). في هذه الحالة قد يحدث أن تُحاول كل من وحدة GPS ورقاقة FTDI الإرسال على نفس الخط في نفس الوقت.
مُرسلان يقومان بالإرسال إلى مُستقبل واحد، مما يُسبب احتمالية حدوث منافسة الناقل
وجود جهازين يُحاولان إرسال البيانات في نفس الوقت على نفس الخط أمر سيء. ففي أفضل الحالات لن يتمكن أي من الجهازين من إرسال البيانات، وفي أسوأ الحالات يتلف خطا الإرسال لكلا الجهازين (لكن هذا نادر الحدوث).
على الجانب الآخر يُمكن توصيل جهازي استقبال بخط إرسال واحد بأمان. هذا ليس أمر شائع ولكنه يعمل. على سبيل المثال إذا أردت توصيل شاشة LCD تسلسلية ببطاقة أردوينو فأسهل شيء تقوم به هو توصيل خط RX الخاص بوحدة LCD بخط TX الخاص ببطاقة الأردينو، وفي الوقت ذاته يكون منفذ TX الخاص بباقة الأردوينو مُتصلاً بخط RX الخاص بمُبرمج USB، ولكن في هذه الحالة يبقى هناك جهاز واحد يقوم بالإرسال.
لكن توصيل خط TX بهذا الشكل يبقى من المُمكن أن يُشكل خطراً على البرنامج (firmware)، لأنك لن تتمكن من تحديد أي جهاز يستقبل أي إشارات يتم إرسالها. فشاشة LCD قد تستقبل بيانات ليست مُهيأة لاستقبالها والتعامل معها، والذي يمكن أن يتسبب في دخولها في حالة غير معروفة.
بوجه عام يُفضل استخدام ناقل تسلسلي واحد لكل جهازين تسلسليين.
المصادر والمُضي قدماً
بعد أن تعرفت على الاتصال التسلسلي الذي تناولناه، هناك الكثير من المفاهيم والمشاريع والتقنيات التي يُمكنك استكشافها.
هل تريد التعرف على المزيد من معايير الاتصال التسلسلي؟ هل تفضل التعرف على واجهات متزامنة؟
- الواجهة التسلسلية الطرفية ((SPI) Serial Peripheral Interface) (قريباً)
- آي سكويرد سي (I2C) (قريباً)
تمّت ترجمة هذه المادّة من موقع sparkfun تحت تصريح كرييتف كومّونز 3 (Creative Commons 3.0)
مقال جيد..بارك الله فيك..