سؤال

لدي برنامج Java يستمع باستمرار لرسائل تنسيق معين على منفذ تسلسلي. عندما لا يرسل تطبيق المرسل رسائل ، فإنه يرسل رسائل نبضات القلب بالتنسيق التالي:

  • البايت 1: 1
  • البايت 2: 0xfe
  • البايت 3: 0xed
  • بايت 4-255: 0

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

  • إذا قرأت للتو 1: قم بالتبديل إلى حالة new_message.

  • إذا قرأت للتو 0xfe: قم بالتبديل إلى حالة Conperior_heartBeat.

  • إذا قرأت للتو 0xed: قم بالتبديل إلى حالة نبضات القلب

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

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

المحلول

كانت المشكلة في الواقع فقط أنسى أهمية الطلب بت. كانت قناة البايت التي كنت أقرأها من Little Endian ، لذا كان عدد صحيح 16 بت 0xfeed قادمًا لي كـ 0xeed 0xfe بدلاً من 0xfe Oxed. مع مفتاح بسيط في فحص الحالة ، كل شيء يعمل King Peachy.

خالص شكرا لجميع ما علق.

نصائح أخرى

قم بتمديد آلة الولاية الخاصة بك وتحقق من آخر 3 بايتات المستلمة. comapre لهم إلى أول 3 بايت من رسالة نبضات القلب. كما يبدو أن البايتات الثلاثة الأولى هي نفسها دائمًا ، يمكنك استخدام هذا للكشف عن بداية رسالة نبضات القلب والقيام بمزامنةك.

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