بسيطة المسلسل من نقطة إلى نقطة بروتوكول الاتصال

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

  •  03-07-2019
  •  | 
  •  

سؤال

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

يجب أن تكون البيانات الضوضاء المحمية (إلى جانب تدقيق التماثل ، أعتقد أنني بحاجة إلى بعض البيانات الأخرى طريقة تصحيح).

هل هناك أي معيار حل لهذا ؟ (أحتاج فقط فكرة ، وليس الحل الكامل).

P. S.أي نصيحة هي محل تقدير. P. P. S نعتذر عن أي الأخطاء النحوية, أرجو أن تفهم.

تعديل 1. لم أقرر ما إذا كان سيتم ماجستير/الرقيق البروتوكول أو كلا الجانبين يمكن الشروع في الاتصالات.الكمبيوتر يجب أن تعرف متى مايكرو فعلت يمكنك إرسال البيانات.فإنه يمكن بشكل مستمر الاستطلاع الصغيرة إذا كانت البيانات جاهزة ، أو الصغيرة يمكن إرسال البيانات عند انجاز المهمة.أنا لا أعرف أيهما أفضل وأبسط.

تحرير 2. الأجهزة الطبقة المادية البروتوكول. منذ RS-232ج التسلسلي القياسية المستخدمة في الكمبيوتر ، وسوف تستخدم التواصل غير المتزامن.وسوف تستخدم فقط RxD, TxD و GND الإشارات.لا أستطيع استخدام أسلاك إضافية لأن متحكم AFAIK لا دعم لهم.BTW أنا باستخدام AVR ATmega128 رقاقة.

لذا سوف تستخدم ثابت سرعة البث بالباود, 8 بت من البيانات ، 2 وحدات بت التوقف دون تدقيق التماثل (أو مع؟).

وصلة البيانات بروتوكول.هذا السؤال في المقام الأول.شكرا لاقتراحك HDLC, PPP و Modbus البروتوكولات.سوف البحوث على ذلك.

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

المحلول

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

بالإضافة إلى استخدام HDLC من أجل تأطير الحزمة.لقد شكل حزمة بلدي مثل التالية.هكذا هي الخيارات مرت باستخدام 802.11

U8 cmd;
U8 len;
u8 payload[len];

إجمالي حجم كل الأوامر حزمة لين +2

ثم تحديد الأوامر مثل

#define TRIGGER_SENSOR 0x01
#define SENSOR_RESPONSE 0x02

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

لذا وضع كل ذلك معا في حزمة تبدو كما يلي.

 // total packet length minus flags len+4
 U8 sflag;   //0x7e start of packet end of packet flag from HDLC
 U8 cmd;     //tells the other side what to do.
 U8 len;     // payload length
 U8 payload[len];  // could be zero len
 U16 crc;
 U8 eflag;   //end of frame flag

سيقوم النظام ثم رصد المسلسل تيار العلم 0x7e و عندما يكون هناك يمكنك التحقق من طول لمعرفة ما إذا كان pklen >= 4 و pklen=len+4 و أن crc صالحة.ملاحظة لا تعتمد على مجرد crc الصغيرة الحزم سوف تحصل على الكثير من ايجابيات كاذبة أيضا التحقق من طول.إذا كان طول أو crc لا يطابق فقط إعادة تعيين طول و حقوق الطفل و تبدأ مع فك الإطار الجديد.إذا كانت المباراة ثم نسخ الحزمة إلى جديد العازلة ونقله إلى الأمر تجهيز وظيفة.دائما إعادة تعيين طول واتفاقية حقوق الطفل عندما يكون العلم هو تلقي.

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

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

أيضا عندما كنت تفعل شبكة نقل يجب تصميم بأنها مكدس شبكة الاتصال مثل OSI مدل كما Foredecker نقاط لا ننسى الطبقة المادية الاشياء.منصبي مع HDLC هو طبقة وصلة البيانات و RPC و التعامل مع الأمر هو تطبيق طبقة.

نصائح أخرى

RS232 البروتوكولات هي صعبة.اقتراح لاستخدام HDLC, هو فكرة جيدة ، ولكن ليس لها حل كامل.هناك أشياء أخرى عليك أن تقرر:

  • كيف سيكون معدل الباود بين الجهازين يكون العزم ؟ Autobuad?محددة مسبقا أو مجموعة وفسر?
  • هل تدفق التحكم في البرامج أو الأجهزة أو كليهما ؟ ملاحظة إذا كنت تستخدم أجهزة التحكم في التدفق ثم يجب أن تأكد من أن الكابلات يتم بناؤها بشكل صحيح.
  • بالحديث عن الكابلات, هذا هو الألم ضخمة مع RS233.اعتمادا على الجهاز, قد تحتاج إلى استخدام مباشرة من خلال كابل أو عبر كابل أو البديل.
  • باستخدام البرمجيات القائمة على التحكم في التدفق آلية يمكن أن تكون فعالة كما أنه يسمح أبسط كابل أن تستخدم - فقط ثلاثة السلكية (TX, RX, و من الشائع).
  • هل اختيار 7 أو 8 بت الكلمة ؟
  • الأب التكافؤ أو برامج تدقيق الأخطاء.

أقترح عليك أن تذهب مع 8 بت البيانات ، أي أجهزة التكافؤ ، 1 بت توقف ، واستخدام البرمجيات القائمة على التحكم في التدفق.يجب عليك استخدام autobaud إذا كان الجهاز يدعم ذلك.إن لم يكن, ثم autobaud هو شيطاني من الصعب القيام به في البرنامج.

هناك بعض إجابات جيدة هنا ، وفيما يلي بعض المؤشرات المفيدة:

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

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

قد ترغب في النظر في تصحيح الخطأ (مثل المبالغة).حزمة 8 بت من البيانات في 12 بت المحمية بايت.أي واحد من أولئك 12 بت يمكن أن انقلبت في الطريق الأصلي 8 بت استردادها.مفيدة لتخزين البيانات (المستخدمة على الأقراص المدمجة) أو حيث الجهاز لا يمكن إعادة إرسال بسهولة (وصلات الأقمار الصناعية ، في اتجاه واحد rf).

حزمة أرقام تجعل الحياة أسهل.حزمة إرسال يحمل عدد الردود تحمل نفس العدد وهو العلم قائلا: "رد".وهذا يعني أن الحزم التي لم تصل (مزامنة تلف أقول) يتم الكشف عنها بسهولة من قبل المرسل في وضع الازدواج مع ارتباط بطيء, اثنين من الأوامر يمكن إرسالها قبل أول رد.هذا أيضا يجعل بروتوكول تحليل أسهل (طرف ثالث يمكن أن نفهم الحزم التي وردت مع عدم وجود المعرفة الأساسية البروتوكول)

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

اقتراحي هو modbus.انها فعالة وسهلة بروتوكول قياسي للاتصال مع الأجهزة التي لديها أجهزة الاستشعار و المعلمات (على سبيل المثال PLC).يمكنك الحصول على المواصفات في http://www.modbus.org.انها كانت موجودة منذ عام 1979 و تكتسب شعبية ، سيكون لديك أي مشكلة في العثور على أمثلة المكتبات.

قرأت هذا السؤال بضعة أشهر إلى الوراء ، تواجه نفس المشكلة بالضبط, و لم تجد أي شيء فعالة بما فيه الكفاية بالنسبة صغيرة 8 بت الصغير مع كميات صغيرة من ذاكرة الوصول العشوائي.حتى مستوحاة من يمكن لين بنيت شيء للقيام بهذه المهمة.اتصلت عليه مين (متحكم ربط الشبكة) و لقد قمت برفعه على جيثب هنا:

https://github.com/min-protocol/min

هناك نوعان من التطبيقات هناك:واحد في embedded C, واحد في بيثون على جهاز كمبيوتر.بالإضافة إلى القليل من "مرحبا العالم" اختبار برنامج PC يرسل الأوامر و البرامج الثابتة أضواء LED.أنا blogged حول الحصول على هذا وتشغيلها على لوحة اردوينو هنا:

https://kentindell.wordpress.com/2015/02/18/micrcontroller-interconnect-network-min-version-1-0/

مين هو بسيط جدا.أنا ثابت طبقة 0 تمثيل (8 بتات البيانات ، 1 بت توقف ، لا التكافؤ) لكنه ترك بالباود مفتوحة.كل إطار يبدأ مع ثلاثة 0xAA بايت في الثنائية هو 1010101010, لطيفة pulsetrain للقيام autobaud معدل الكشف عن إذا كان أحد طرفي يريد حيوي التكيف مع الآخرين.إطارات 0-15 بايت من الحمولة ، مع 16 بت فليتشر الاختباري كما البايت 8 بت معرف (على قول تطبيق ما الحمولة يحتوي على بيانات).

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

هناك مجال لإدخال تحسينات في المستقبل مع مين.لقد تركت بعض السنانير هناك من أجل منع تمرير الرسائل (4 بت من السيطرة بايت محفوظة) وعلى أعلى مستوى التفاوض من قدرات (معرف 0xFF محجوز) لذلك هناك الكثير من مجال إضافة دعم ل عادة الوظائف المطلوبة.

وإليك البديل البروتوكول:

u8  Sync          // A constant value which always marks the start of a packet
u16 Length        // Number of bytes in payload
u8  Data[Length]  // The payload
u16 Crc           // CRC

استخدام RS232/UART ، PC (المنفذ التسلسلي) و المعالجات (UART) يمكن التعامل مع الحد الأدنى من الجلبة (فقط تحتاج MAX232 رقاقة أو مماثلة للقيام مستوى التحول).

واستخدام RS232/UART, كنت لا داعي للقلق حول ماجستير/الرقيق إذا انها ليست ذات الصلة.التحكم في التدفق هو متاح إذا لزم الأمر.

اقترح برامج الكمبيوتر:إما الكتابة الخاصة بك ، أو Docklight من أجل رصد ومراقبة بسيطة (تقييم نسخة مجانية).

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

في أي حال, مهما فعلت: يبقيه بسيط!

تحرير: باستخدام RS232 مع الكمبيوتر أسهل مما كانت عليه من قبل ، كما يمكنك الآن الحصول على USB إلى RS232/TTL المحولات.نهاية واحدة يذهب إلى جهاز الكمبيوتر الخاص بك USB مقبس تجويف, و يظهر عادي المنفذ التسلسلي ؛ والآخر يخرج 5 فولت أو 3.3 V الإشارات التي يمكن أن تكون مرتبطة مباشرة إلى المعالج الخاص بك مع أي مستوى التحول المطلوبة.

لقد استخدمنا TTL-232R-3V3 من FDTI رقاقة, الذي يعمل تماما على هذا النوع من التطبيق.

لي اقتراح الوحيد هو إذا كنت بحاجة إلى مقاومة للضوضاء قد ترغب في استخدام ثنائية الاتجاه RS-422/485.يمكنك استخدام IC مماثلة هذا على AVR الجانب ، ثم RS-232->RS-422 محول على الجانب PC مثل على 485PTBR هنا.إذا كان يمكنك العثور على أو جعل محمية الكابلات (اثنين الملتوية محمية أزواج) ثم سيكون لديك المزيد من الحماية.و كل هذا غير مرئية micro PC - أي برامج التغييرات.

كل ما عليك التأكد من أن كنت تستخدم كامل دوبلكس نظام وتأكد من القراءة/الكتابة تمكين خطوط أكد على IC.

يمكنك إلقاء نظرة على Telemetry وما يرتبط بها من سطح المكتب التنفيذ في بايثون Pytelemetry

الميزات الرئيسية

وهو PubSub القائمة على بروتوكول, ولكن على عكس MQTT هو نقطة إلى نقطة بروتوكول ، لا وسيط.

أي pubsub بروتوكول يمكنك نشر من نهاية واحدة على topic و يتم إخطار على الآخر في هذا الموضوع.

على جزءا لا يتجزأ من الجانب نشر موضوع بسيط مثل :

publish("someTopic","someMessage")

على الأرقام:

publish_f32("foo",1.23e-4)
publish_u32("bar",56789)

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

// Add an indexing meaning to the topic
publish("foo:1",45) // foo with index = 1
publish("foo:2",56) // foo with index = 2

// Add a grouping meaning to the topic
publish("bar/foo",67) // foo is under group 'bar'

// Combine
publish("bar/foo:45",54)

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

كما PubSub نمط كبيرة بسبب مرونته.يمكنك بناء ماجستير/الرقيق تطبيقات جهاز إلى جهاز ، إلخ.

ج المكتبة GitHub version

ج مكتبة بسيطة جدا لإضافة على أي جهاز جديد طالما لديك الكريم UART المكتبة على ذلك.

عليك فقط أن instanciate بنية بيانات تسمى TM_transport (يحددها Telemetry) ، وتعيين 4 مؤشرات الدالة read readable write writeable.

// your device's uart library function signatures (usually you already have them)
int32_t read(void * buf, uint32_t sizeToRead);
int32_t readable();
int32_t write(void * buf, uint32_t sizeToWrite);
int32_t writeable();

استخدام القياس, لديك فقط قم بإضافة التعليمات البرمجية التالية

// At the beginning of main function, this is the ONLY code you have to add to support a new device with telemetry
TM_transport transport;
transport.read = read;
transport.write = write;
transport.readable = readable;
transport.writeable = writeable;

// Init telemetry with the transport structure
init_telemetry(&transport);  

// and you're good to start publishing
publish_i32("foobar",...

مكتبة بايثون PyPI version

على الجانب سطح المكتب ، هناك pytelemetry وحدة تنفيذ البروتوكول.

إذا كنت تعرف الثعبان ، البرمجية التالية يربط منفذ تسلسلي تنشر مرة واحدة على الموضوع foo, والمطبوعات تلقت جميع المواضيع خلال 3 ثوان ثم إنهاء.

import runner
import pytelemetry.pytelemetry as tm
import pytelemetry.transports.serialtransport as transports
import time

transport = transports.SerialTransport()
telemetry = tm.pytelemetry(transport)
app = runner.Runner(transport,telemetry)

def printer(topic, data):
    print(topic," : ", data)

options = dict()
options['port'] = "COM20"
options['baudrate'] = 9600

app.connect(options)

telemetry.subscribe(None, printer)
telemetry.publish('bar',1354,'int32')
time.sleep(3)

app.terminate()

إذا كنت لا تعرف بيثون ، يمكنك استخدام واجهة سطر الأوامر

Pytelemetry CLI PyPI version

سطر الأوامر يمكن أن تبدأ مع

pytlm

ثم يمكنك connect, ls(قائمة) تلقى الموضوعات ، print البيانات الواردة في هذا الموضوع ، pub(نشر) على الموضوع أو فتح plot على الموضوع لعرض البيانات الواردة في الوقت الحقيقي

enter image description here

enter image description here

فيما تعادل الشيكات (كما انها تأتي عدة مرات هنا):

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

استخدام شيء خفيف مثل CRC16 مع جدول البحث - يمكن احتساب كل بايت وتلقى هو في الأساس مجرد XOR.ستيف Melnikoff اقتراح رائع الصغيرة micros.

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

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

ربما هذا سؤال يمكن يكون غبي تماما ولكن أي شخص يعتبر استخدام واحدة من X/Y/Z المودم البروتوكولات ؟

الفائدة الرئيسية من استخدام واحد من فوق بروتوكولات كبيرة توافر جاهزة للاستخدام تطبيقات في مختلف بيئات البرمجة.

زلة و UDP.على محمل الجد.

جميع أجهزة الكمبيوتر والأجهزة المماثلة التحدث بها.

هناك كتاب جيد و من الأمثلة TCP الهزيل

جيرمي بنثام وقد خلسة حصلت الموافقة المسبقة عن علم بالعمل TCP/IP.وهو AVR هو جيدة مثل الموافقة المسبقة عن علم صحيح ؟

أنصح UDP بدلا من ذلك ، انها الرتق سهلة.

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