كيف يمكنني إرسال أحرف فارغة إلى المنفذ التسلسلي باستخدام Windows API؟

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

  •  23-08-2019
  •  | 
  •  

سؤال

أنا أعمل على برنامج Windows Utility يتصل مع بعض الأجهزة المخصصة باستخدام منفذ COM القياسي. يتطلب مني بروتوكول الاتصال (الذي خرج عن سيطرتي) أن أحيل واستقبال بايت البيانات الخام 8 بت.

أنا حاليا باستخدام وظيفة Windows API التالية لإرسال البيانات إلى منفذ COM:

WriteFile(hFile, lpBuffer, numberOfBytesToWrite, ...)

أين hFile هو مرجع إلى منفذ COM المفتوح بشكل صحيح، و lpBuffer هي مجموعة من البايتات التي قمت بتخزينها في الذاكرة. يعمل الرمز تماما حتى يحتاج إلى إرسال حرف فارغ (ASCII ZERO) إلى الجهاز. WriteFile يتوقف عن إرسال بمجرد اكتشاف حرف Null لأنه يفترض أنه وصل إلى نهاية السلسلة. يحدث هذا على الرغم من ضبط numberOfBytesToWrite على وجه صحيح.

كيف يمكنني إرسال البيانات الخام إلى منفذ COM باستخدام Windows API؟ أفضل استخدام دعوة API القياسية مماثلة ل WriteFile, ، لكنني منفتح على الاقتراحات.

أنا حاليا باستخدام ربيع لإنشاء الأداة المساعدة، ولكن كل ما يفعله هو استدعاء وظيفة Windows API مباشرة.

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

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

المحلول

لقد قمت ببرمجة Windows التسلسلية Windows من قبل، وأنا متأكد من أنني تمكنت من إرسال أحرف فارغة من خلال المنافذ التسلسلية (لن تعمل بروتوكولات نقل الملفات المختلفة على خلاف ذلك). أستطيع أن أفكر في تفسيرات محتملة:

  1. ال يستلم يقوم الجهاز بطباعة البيانات التي تلقاها باستخدام طريقة تتوقف في الحرف الأول الأول. كيف تقوم بتحديد أن جهاز الإرسال ينتهي في الأول؟ هل يمكن أن تكون المشكلة في مكان ما إلى أسفل الخط؟
  2. يتم كسر السائق التسلسلي. هذا غير مرجح إلى حد ما، ولكنه شرح محتمل. إذا كنت تستخدم بعض المنفذ التسلسلي من طرف الطرف الثالث المرجعي وبرامج التشغيل الخاصة به، فقد يكون المشتبه فيه. إذا كنت تستخدم منفذ تسلسلي قياسي مدمج مع برامج تشغيل Windows العادية، فمن المحتمل أن تكون هذه مشكلة.

كان لدي نظرة سريعة على ريديك وهناك شرح ثالث ممكن:

  1. قد تواجه التنظيم أن RapidQ قد يعمل في عملية استدعاء وظائف API Win32 قد تواجه مشكلة في أحرف فارغة مضمنة في البيانات لإرسالها. لا أعرف أي شيء عن RapidQ، لكن هذا رابط آخر في السلسلة التي يجب مراعاتها.

نصائح أخرى

ربما يكون GREG صحيحا، لكنني أتحقق من إعدادات منفذ COM الخاصة بك. تأكد من ضبط إعدادات DCB الخاصة بك بشكل صحيح. ابحث عن SetCommstate، و GetCommState للحصول على معلومات.

عادة، المسلسل هو 8N1، لكن جهازك قد يستخدم بعض التكافؤ الأخرى، أو التوقف عن تكوين بت، إلخ.

مثل جريج، لقد قمت بالكثير من العمل على المسلسل بنفسي، وغالبا ما يكون هذا هو مصدر المشاكل ... حاول التحدث مع RS485 وبنية DCB غير صحيحة ... HEH ..

لاري.

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

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

إذا لم يساعد أي من هذا، فيمكنك دائما أن تفعل ما أقوم به. استخدم رمز GREG COMM لاختبار الجهاز. تذكر Qmodem؟ :) أداة لطيفة جدا لاختبار / تصحيح الروتين التسلسلي. أنت ccould حتى استخدام QMODEM وبرنامج نصي QModem بسيط لقراءة منفذ COM على مربع آخر (أو منفذ آخر في المربع نفسه)، وطباعة قيمة سداسي عشرية لكل سحر المرسلة. اه انتظر. qmodem لديه أن بنيت في. :) استخدم مضاهاة ASCII Debug وسيعرض قيم Hex لكل سحر يأتي عبر المنفذ التسلسلي. ثم، يمكنك التحقق على الأقل إذا كان التعليمات البرمجية الخاصة بك يعمل بشكل صحيح أم لا.

الآن، السؤال. هل يعود بنكتي الزوج عندما يضرب الفاتح، أو يفعل ذلك فقط الجلوس والانتظار، ولا يعود أبدا؟

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

لإرسال حرف فارغ من خلال المسلسل، يمكنك استخدام الدالة SetendOffile ()، وإعطاء معالج المنفذ كملف.

إذا كان لديك الكثير من البيانات الفارغة لإرسالها، فمن المحتمل أنها ليست مثالية، لكنها حلوة.

تفاصيل الوظيفة

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