البروتوكولات المستخدمة للحديث بين جزءا لا يتجزأ من وحدة المعالجة المركزية الكمبيوتر

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

سؤال

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

في هذه اللحظة وأنا أفكر تماما استضافة مدفوعة متزامن البروتوكول:الكمبيوتر ترسل الطلبات جزءا لا يتجزأ من وحدة المعالجة المركزية إجابات.أي أفكار أخرى ؟

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

المحلول

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

FreeModBus للحصول على النوافذ ومصدر المضمنة.

نصائح أخرى

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

Host -->  [V02?]      // Request voltage #2
AVR  -->  [V02=2.34]  // Reply with voltage #2
Host -->  [V06=3.12]  // Set voltage #6
AVR  -->  [V06=3.15]  // Reply with voltage #6

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

واعتمادا على متطلبات السرعة والموثوقية، قد ترميز الأوامر إلى واحد أو اثنين بايت وإضافة الاختباري.

وانها دائما فكرة جيدة للرد مع الفعلي الجهد، بدلا من مجرد ترديد الأمر، لأنه يوفر عملية قراءة لاحقة.

ومفيد أيضا لتحديد رسائل الخطأ، في حال كنت بحاجة إلى التصحيح.

وتصويتي هو للقراءة الإنسان.

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

ولقد فعلت مثل هذه الاشياء مع تنسيق ثنائي بسيط

struct PacketHdr
{
  char syncByte1;
  char syncByte2;
  char packetType;
  char bytesToFollow;  //-or- totalPacketSize
};

struct VoltageSet
{ 
   struct PacketHdr;
   int16 channelId;
   int16 voltageLevel; 
   uint16 crc;
};

struct VoltageResponse
{
   struct PacketHdr;
   int16 data[N];  //Num channels are fixed
   uint16 crc;
}

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

ويجب أن يكون نوع من التعداد الذي يروي كيفية intepret الحزمة. يمكن الاستدلال على حجم من نوع، ولكن إذا قمت بإرسال ذلك صراحة، ثم المتلقي يمكن التعامل مع أنواع غير معروفة من دون الاختناق. يمكنك استخدام "إجمالي حجم الحزمة '، أو' بايت لمتابعة '؛ هذا الأخير يمكن أن تجعل رمز المتلقي قليلا أكثر نظافة.

واتفاقية حقوق الطفل في نهاية يضيف المزيد من التأكيد على أن لديك بيانات صالحة. أحيانا رأيت CRC في الرأس، مما يجعل إعلان الهياكل أسهل، ولكن وضعه في نهاية يتيح لك تجنب تمرير اضافية على البيانات عند إرسال الرسالة.

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

إذا كنت متأكدا من أن كل المنابر استخدام IEEE-754 عوامات (تأليف PC) ولها نفس endianness، ثم يمكنك استخدام عوامات كنوع البيانات. وإلا فإنه من الأفضل استعمال الأعداد الصحيحة، إما الخام بت A / D، أو نطاق محدد مسبقا (أي 1 = قليلا .001V يعطي مجموعة +/- 32.267 V)

وآدم هيك يجعل الكثير من نقاط كبيرة. يجب أن تكون البساطة وقوة التركيز. نقل ASCII قراءة الإنسان يساعد كثيرا أثناء تصحيح. الاقتراحات كبيرة.

وأنها قد تكون مبالغة لاحتياجاتك، ولكن HDLC و / أو PPP إضافة في مفهوم طبقة وصلة البيانات، وجميع الفوائد (والتكاليف) التي تأتي مع طبقة وصلة البيانات. إدارة الارتباط، وصياغة، واختبارية، أرقام التسلسل، وإعادة الإرسال، الخ ... كل مساعدة على ضمان اتصالات قوية، ولكن إضافة تعقيد ومعالجة وحجم الرمز، وقد لا يكون من الضروري للتطبيق الخاص بك معين.

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

بروتوكول أعلى من نقل الحقيقة عن الاحتياجات الخاصة بك.من وصفك يبدو أن بسيطة متزامن البروتوكول هو بالتأكيد بما فيه الكفاية.ما جعل يمكنك التجول والبحث عن الإضافية النهج ؟ حصة الشكوك الخاصة بك ونحن سوف نحاول مساعدة :).

إذا لم أكن أتوقع أن عليك القيام به نقل ثنائية فعالة، كنت اذهب للواجهة على غرار محطة اقترح بالفعل.

إذا كنت لا تريد أن تفعل شكل حزمة ثنائي، فإنني أميل إلى استخدام شيء وهو مبني على شكل PPP البايت asnc HDLC، التي هي بسيطة للغاية وسهلة لإرسال تلقي، في الأساس:

والحزم تبدأ وتنتهي مع 0x7e يمكنك الهروب من شار التي كتبها التقديم مع 0x7d وتبديل بعض الشيء 5 (أي XOR مع 0x20) حتى 0x7e يصبح 0x5e 0x7d ويصبح 0x7d 0x7d 0x5d

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

وأنا عادة لا يحركها المضيف الاشياء متزامن ما لم يكن لدي سبب وجيه جدا أن تفعل خلاف ذلك. انها تقنية التي تمتد من بسيط RS232 نقطة نقطة لmultidrop RS422 / 485 دون مشاحنات - في كثير من الأحيان مكافأة

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

وهكذا، وهذا حصل لي التفكير وبصحة جيدة، وهنا عدد قليل من أفكاري -

ونظرا إلى أن هذه الشريحة لديها 6 قنوات ADC، وعلى الأرجح كنت تستخدم RS-232 بالاتصالات التسلسلي (تخمين من سؤالك)، وبالطبع مساحة متاحة محدود، وتحديد هيكل قيادة بسيطة وسوف يساعد، كما يشير آدم من - قد ترغب في الحفاظ على معالجة المدخلات إلى أدنى حد ممكن في رقاقة، لذلك ثنائي يبدو جذابا ولكن المفاضلة في سهولة تطوير وخدمة (قد تضطر إلى المتاعب اطلاق النار على إدخال ميت 6 أشهر من الآن) - الطرفية السريعة هو أداة قوية التصحيح -، لدرجة أن حصلت لي التفكير في كيفية تنفيذ هيكل القيادة بسيط مع موثوقية جيدة

وهناك بعض الاعتبارات العامة -

وإبقاء أوامر نفس الحجم - يجعل فك أسهل

.

وتأطير الأوامر والاختيارية مبلغ الشيك، كما يشير آدم من يمكن أن تكون ملفوفة بسهولة حول أوامرك. (مع الأوامر صغيرة وبسيطة XOR / ADD الاختباري هو سريع وغير مؤلم)

وأنصح إعلان بدء إلى المضيف مع إصدار البرامج الثابتة في إعادة الضبط - على سبيل المثال، "مرحبا، إصدار البرنامج الثابت 1.00z" - أن أقول المضيف أن الهدف بدأت للتو وما يشغل

إذا كنت تراقب في المقام الأول، قد ترغب في النظر في "حرة تديرها" واسطة حيث الهدف ببساطة من خلال دورة التناظرية والرقمية قراءات - بالطبع، هذا ليس من الضروري أن تكون مستمرة، يمكن أن يكون متباعدة في 1 و 5 و 10 ثانية، أو فقط على الأوامر. الصغير الخاص بك هو دائما الاستماع ذلك بإرسال القيمة التي تم تحديثها مهمة مستقلة.

وإنهاء كل سطر الانتاج مع CR (أو حرف آخر) يجعل التزامن في المضيف على التوالي إلى الأمام.

وعلى سبيل المثال الصغيرة الخاصة بك يمكن أن الناتج ببساطة السلاسل.

  V0=3.20
  V1=3.21
  V2= ...
  D1=0
  D2=1
  D3=...
  and then start over -- 

وبالإضافة إلى ذلك، الأوامر يمكن أن تكون بسيطة حقا -

و؟ - قراءة جميع القيم - ليس هناك أن العديد منهم، لذلك الحصول على كل منهم

X = 12.34 - "." لتعيين قيمة، البايت الأول هو المنفذ، ثم الجهد وأوصي الحفاظ على "=" و كما تأطير لضمان حزمة صالحة إذا كنت التخلي عن الاختباري.

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

5=0 
6=9
2=5  

والذي سيشكل ميناء 5 حالا، ميناء 6 إلى كامل على، وميناء 2 إلى نصف قيمة - مع هذا النهج، أسكي والبيانات الثنائية ليست سوى حوالي على قدم المساواة في ما يخص موارد الحوسبة / فك التشفير في الدقيقة. أو لمزيد من الدقة، وجعل الناتج 2 بايت، على سبيل المثال، 2 = 54 - OR، إضافة جدول XREF والقيم لا تملك حتى أن تكون خطية حيث البايت البيانات هو مؤشر الى طاولة نظرة المتابعة .. .

وكما أود أن أقول. بسيط هو عادة أفضل، إلا أنه ليس كذلك.

وآمل أن يساعد هذا قليلا.


وكان الفكر آخر أثناء إعادة القراءة؛ يمكن إضافة "*" القيادة طلب البيانات ملفوفة مع علامات HTML والآن التطبيق المضيف يمكن ببساطة إعادة توجيه الإخراج من الجزئي إلى المتصفح ولاء، ومتصفح جاهزة -

:)

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