طريقة لتحويل دفق البايت إلى دفق حزم في C89 على جهاز مضمن [مغلق]

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

  •  03-07-2019
  •  | 
  •  

سؤال

أنا أعمل على جهاز مضمن متصل بالكمبيوتر باستخدام rs232 (rs232 عبر USB).

أفكر في تطوير البروتوكول الخاص بي:

<MAGIC><LENGTH><BINARY DATA><CRC>

لكنني لا أريد إعادة اختراع العجلة.

لو سمحت ملحوظة الذي - التي:أفكر في جهاز مقيد تمامًا:4 كيلو بايت من ذاكرة الوصول العشوائي، لا يوجد نواة، ولا C lib قياسي.

هل يمكنك التفكير في طريقة قياسية للقيام بذلك (ربما مكتبة مفتوحة المصدر)؟

إذا قمت بترميز الحل الخاص بك، فهل لديك أي أفضل الممارسات؟

  • هل تستخدم MAGIC بايت أيضًا في نهاية الحزم؟
  • ربما يكون من الأفضل استخدام الفجوات الزمنية بدلاً من المحددات؟
  • كيف يمكنك العثور على بداية الحزم في دفق البيانات الثنائية؟
  • ربما يكون من الأفضل استخدام بروتوكولات النص؟

تحديث:يرجى إعادة قراءة السؤال.لا ينبغي لي أن أطلب المكتبة بل الممارسات الجيدة.

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

المحلول

يرى هذه الإجابة أعطيتها لسؤال مشابه جدًا فيما يتعلق بتفاصيل بروتوكول بسيط.

للرد على نقاطك المحددة:

  1. لا تسبب وحدات البايت "السحرية" الموجودة في نهاية الحزم أي ضرر، ولكنها تكون زائدة عن الحاجة إذا كنت تعرف بالفعل المدة المفترض أن تكون عليها الحزمة ولديك CRC.
  2. قد يكون من المعقول تحديد أوقات المهلة، لذلك إذا كانت هناك فجوة كبيرة جدًا بين البايتات داخل حزمة واحدة، فسيتم وضع علامة على خطأ.وقد استخدمت مودبوس, ، لست مقتنعًا بقيمة استخدام المحددات المستندة إلى الوقت في أي مكان آخر.
  3. هل تقصد "كيف يمكنك العثور على بداية الحزم في دفق من البيانات الثنائية"؟إذا كان الأمر كذلك، فربما تحدد الحد الأدنى للفجوة بين الحزم، و/أو تطلب من المستلم الإقرار بعد كل حزمة.
  4. يجعل عملية تصحيح الأخطاء أسهل، ولا تتطلب أي برامج خاصة على جهاز الكمبيوتر، ولكنها ليست فعالة للغاية.وبطبيعة الحال، إذا كانت سهولة الاستخدام أكثر أهمية من الكفاءة، فإن النظام القائم على النص يكون مناسبًا تمامًا.

نصائح أخرى

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

void buffer_packet(unsigned char rx_byte)
{
    static unsigned char byte_count = 0;
    static unsigned char packet[8];

    packet[byte_count++] = rx_byte;
    if (byte_count == 8)
    {
        unsigned char crc = calculate_crc(packet, 8);

        write_uart(0x55);
        write_uart(8);
        while (byte_count--)
        {
            write_uart(packet[7 - byte_count]);
        }
        write_uart(crc);
    }
}

أو ربما أنا نقلل من مشكلتك.إذا كنت تبحث عن كيفية إنشاء بتات RS232، فابحث في ورقة بيانات وحدات التحكم الدقيقة لديك.

حول الشيء الوحيد الذي يتجاوز عناصر الإدخال/الإخراج الأولية الخاصة بك سيكون حساب CRC.هناك مقالة أنيقة، مع رمز، هنا.

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