اتصالات المنفذ التسلسلي:استقصاء المنفذ التسلسلي مقابل استخدام حدث DataReceived للمنفذ التسلسلي

StackOverflow https://stackoverflow.com/questions/644623

  •  22-07-2019
  •  | 
  •  

سؤال

أنا فقط أراجع بعض التعليمات البرمجية التي كتبتها للتواصل مع المنفذ التسلسلي في C# على CF2.0.أنا لا أستخدم حدث DataReceived لأنه غير موثوق. تنص MSDN على ما يلي:

لا يتم رفع الحدث datareceived لكل بايت تم استلامه.استخدم خاصية Bytestoread لتحديد مقدار البيانات المتبقية التي يمكن قراءتها في المخزن المؤقت.

أقوم باستقصاء المنفذ باستخدام read () ولدي مفوض يقوم بمعالجة البيانات عند قراءتها.قرأت أيضًا في مكان ما أن "الاقتراع سيء" (لم يتم تقديم أي تفسير).

هل هناك أي أفكار لماذا قد يكون الاقتراع سيئًا؟بصرف النظر عن تحذيرات الترابط المعتادة - لدي خيط منفصل (خيط في الخلفية) يستقصي المنفذ، ويتم الخروج من الخيط بعد قراءة البيانات، وتم اختبار كل شيء ويعمل بشكل جيد.

هل كانت مفيدة؟

المحلول

والطريقة وأنا أقرأ ذلك، كنت قد تحصل حدث واحد للبايت متعددة، بدلا من حدث واحد لكل بايت. أنا لا تزال تتوقع الحصول على حدث عندما تكون البيانات غير جاهز، وليس لديها ذلك "تخطي" بعض بايت تماما.

ولقد استعملت دائما هذا الحدث، وليس لديه أي مشكلة مع ذلك.

نصائح أخرى

تقول الحكمة التقليدية أن "الاقتراع أمر سيء" لأنه غالبًا ما ينتهي به الأمر إلى أن يكون عملية مرتبطة بوحدة المعالجة المركزية (CPU).إذا تم استخدام حظر الإدخال/الإخراج بدلاً من ذلك، فستكون وحدة المعالجة المركزية متاحة للعمليات الأخرى حتى يحدث الحدث.

ومع ذلك، من الممكن عادةً إعداد الأمور بحيث ينتظر الاستطلاع مهلة (قصيرة) قبل العودة عندما لا تتوفر أي أحرف.إذا تم اختيار مهلة مناسبة، فإن حلقة الاستقصاء البسيطة الخاصة بك تستخدم وقتًا أقل بكثير لوحدة المعالجة المركزية، ويتم تشغيل العمليات الأخرى أيضًا.

لم أستخدم المنافذ التسلسلية من C# على الإطلاق، لكنني سأخاطر بتخمين ما تعنيه الوثائق

لا يتم ضمان رفع الحدث DataReceived لكل بايت تم تلقيه.استخدم خاصية Bytestoread لتحديد مقدار البيانات المتبقية التي يمكن قراءتها في المخزن المؤقت.

هو أنه لا يمكنك توقع الحصول على حدث واحد لكل شخصية.قد يقوم في بعض الظروف بتسليم الحدث بأكثر من شخصية متاحة.ما عليك سوى استرداد جميع الأحرف المتوفرة في معالج الحدث الخاص بك، وسيكون كل شيء على ما يرام.

يحرر: قد يكون إجراء مكالمة حظر على سلسلة رسائل القارئ هو أفضل إجابة بشكل عام.إنه لا يتم الاستقصاء في حد ذاته نظرًا لأن مؤشر الترابط محظور حتى وصول الأحرف.قد تحتاج إلى ضبط أحجام المخزن المؤقت وبعض إعدادات المنفذ التسلسلي إذا كنت بحاجة إلى معالجة البيانات عند وصولها بدلاً من معالجتها في أجزاء ذات حجم ثابت.

وأنا متأكد من تحركها رمز برنامج تشغيل المنفذ التسلسلي الأساسي المقاطعة، حتى عند استخدام هذه الدعوة مقروءة الحجب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top