مقاطعة الإدخال/الإخراج التسلسلية برمجيا عند إزالة جهاز USB - C ++

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

سؤال

لديّ تطبيق يتم فيه إجراء I/O التسلسلي باستخدام جهاز USB المرفق عبر منفذ COM الظاهري. عندما يتم اكتشاف الإزالة المفاجئة للجهاز ، ما هو أفضل طريقة لإيقاف الإدخال/الإخراج التسلسلي. هل يجب أن أغلق المنفذ ببساطة؟ أو ، هل يجب أن يكون هناك متغير عالمي ، يتم الحفاظ عليه للإشارة إلى وجود الجهاز ، يجب فحصه في كل وظيفة I/O التسلسلية قبل محاولة نقل/تلقي البيانات؟ أو ، هل يجب أن يكون مزيجًا من الاثنين ، أو أي شيء آخر؟ شكرًا.

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

المحلول

أفترض أنك تقوم بتشغيل Windows. هذا يعتمد على كيفية تصميم تدفق الاتصال الخاص بك.

لديّ كائن أساسي حيث اشتقت كائن Comport (والعديد من كائنات الاتصال الأخرى). يقوم كائن Comport بإنشاء فئة TxThread و RxThread واحدة. تنتظر هذه الخيوط "التداخل" للإشارة إلى أن عملية القراءة أو الكتابة قد انتهت WaitForMultipleObjects().

يذهب TxThreads إلى النوم إذا لم يكن هناك شيء يجب القيام به ويستيقظ من خلال وظيفة TXWrite (البيانات بين العملية الرئيسية والخيط يمر عبر مخزن مؤقت FIFO آمن).

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

لاكتشاف ما إذا كان منفذ USB هو ConnectD/disconcanted أستمع إلى رسالة Windows DEVICE_CHANGE. إذا تم فصل المنفذ ، فقد قمت بتعيين الحدث وانتظرت أن تخرج مؤشرات الترابط قبل حذف فئة المنفذ وتغلق المنفذ.

لقد وجدت هذا النهج موثوقًا وآمنًا للغاية. إنه جوهر في منصة الاتصال التي صممتها لأكثر من 8 سنوات وما زالت الركل.

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