كيفية التحقق من اكتمال الكتابة التسلسلية في بايثون راaspberry Pi
يمكن أن يكون التعامل مع الاتصالات التسلسلية في أجهزة مثل Raspberry Pi أمرًا مثيرًا للتحدي، خاصةً عندما يتعلق الأمر بالتأكد من أن كتابة البيانات عبر واجهة الـ UART قد اكتملت دون فقدان أي أحرف. في هذا المقال، سوف نستعرض كيفية التحقق من اكتمال الكتابة التسلسلية بواسطة بايثون على Raspberry Pi، بالإضافة إلى تقديم بعض الحلول لتحسين أداء الكتابة التسلسلية.
التعريف بعملية الكتابة التسلسلية
الكتابة التسلسلية هي عملية إرسال البيانات عبر واجهة UART (Universal Asynchronous Receiver/Transmitter)، والتي تُستخدم للتواصل مع الأجهزة الأخرى مثل المتحكمات الدقيقة أو الحساسات. في بعض الأحيان، قد نواجه مشكلة في فقدان بعض البيانات عند كتابة الأحرف، خاصةً إذا كانت تؤخذ كافة الإجراءات في الاعتبار مثل التأخير بعد الكتابة. لذا، فإن الهدف هو تنفيذ عملية الكتابة دون أي فترة انتظار.
استيراد المكتبات اللازمة
للعمل مع الـ UART في Raspberry Pi، ستحتاج إلى استيراد المكتبات التالية:
import socket
import serial
from threading import Thread
from datetime import datetime
هذه المكتبات توفر لنا الأدوات اللازمة للتعامل مع الشبكات والتواصل التسلسلي بشكل فعال.
تكوين الاتصال التسلسلي
عند إعداد الاتصال التسلسلي، قم بتهيئة إعدادات المنفذ، مثل معدل البود وحجم البايت وما إلى ذلك. يجب أن يتم ذلك قبل البدء في استقبال أي بيانات عبر الشبكة:
ser = serial.Serial(
port="/dev/ttyS0",
baudrate=9600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS
)
إدارة الاتصالات الواردة
بمجرد تكوين الاتصال التسلسلي، يمكننا استقبال البيانات من العملاء باستخدام المقبس. إليك كيفية إنشاء خادم TCP يستقبل البيانات من عملاء مختلفين:
def on_new_client(client_socket, addr):
try:
while True:
client_socket.settimeout(60)
data = client_socket.recv(1)
ser.write(data)
client_socket.settimeout(None)
if not data:
print(f'العميل {addr} غير متصل')
break
current_time = datetime.now().strftime("%H:%M:%S")
print(f"العنوان: {addr}, الوقت: {current_time}, البيانات: {data}")
except socket.timeout:
print(f"انتهت مهلة الاتصال لـ {addr}")
except Exception as e:
print(f"خطأ في العميل {addr}: {e}")
finally:
client_socket.close()
print(f"تم إغلاق الاتصال لـ {addr}")
في هذه الدالة، يتم استقبال البيانات من العميل وكتابتها في الاتصال التسلسلي. إذا انقطع الاتصال أو حدث خطأ، يتم التعامل مع ذلك وإغلاق الاتصال.
تشغيل الخادم
يمكنك بدء الخادم باستخدام دالة main
التي تتعامل مع اتصالات العملاء:
def main():
global ser
host = '192.168.176.248'
port = 4002
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(5)
print(f"بدأ الخادم على {host}:{port}")
while True:
client_socket, addr = s.accept()
print(f"اتصال جديد من: {addr}")
thread = Thread(target=on_new_client, args=(client_socket, addr), daemon=True)
thread.start()
if __name__ == '__main__':
main()
يتم هنا إعداد خادم يستقبل الاتصالات ويبدأ خيطًا جديدًا لكل عميل للمعالجة المتزامنة.
كيفية التحقق من اكتمال الكتابة التسلسلية
لتحسين الموثوقية عند الكتابة التسلسلية، يمكن الاعتماد على مبدأ التحكم في التدفق لضمان اكتمال الكتابة. يمكن تحقيق ذلك باستخدام مكتبة serial
مع بعض التحقق الإضافي للتأكد من أن البيانات قد تمت كتابتها بشكل كامل قبل استقبال بيانات جديدة.
هناك عدة طرق لذلك، مثل استخدام مؤشرات حالة أو بروتوكولات تسلسلية متقدمة، لكن في العديد من الحالات، يكفي الانتظار حتى يتم تأكيد الكتابة عبر واجهة UART.
الخاتمة
يعتبر التحقق من اكتمال الكتابة التسلسلية في Raspberry Pi باستخدام بايثون من الأمور الأساسية لضمان نقل البيانات بشكل موثوق. بتطبيق الخطوات السابقة، يمكنك تحسين دقة وموثوقية اتصالاتك التسلسلية دون الحاجة للانتظار بعد كل عملية كتابة. باتباع هذه التعليمات، يمكنك تجنب فقدان البيانات وتحقيق استقرار أكبر في نظامك.”
بهذا الشكل، سيكون لديك فهم أوضح لكيفية التعامل مع الكتابة التسلسلية في مشروعات Raspberry Pi باستخدام بايثون، مع الوعي بما يشمله ذلك من أهمية التحقق من الاكتمال لضمان عدم فقدان البيانات.