কখন ASCII থেকে উন্নত সিরিয়াল প্রোটোকলগুলিতে স্যুইচ করা উচিত?


28

আমার সমস্ত মাইক্রোকন্ট্রোলার ডিভাইসগুলি যা ইউআর্টের মাধ্যমে পিসির সাথে যোগাযোগ করে কমান্ডগুলি প্রেরণ এবং ডেটা গ্রহণের জন্য (এসারডিনোতে কার্যকর হিসাবে) ASCII স্ট্রিং ব্যবহার করে। আমি যখন ইলেকট্রনিক্সে খনন শুরু করি তখনই আমি তা শিখেছিলাম এবং আমি সর্বদা খালি স্ট্রিংগুলি পর্যাপ্ত পরিমাণে পাঠানো দেখতে পেতাম। তবে আমি লক্ষ্য করেছি যে বেশিরভাগ ডিভাইসগুলিতে আমি এসেছি এমন পরিশীলিত বাইনারি প্রোটোকল ব্যবহার করেছি যাতে ফাংশন কোড, ঠিকানা এবং সিআরসি ত্রুটি পরীক্ষা করা অন্তর্ভুক্ত।

বেসিক ASCII যোগাযোগ কখন গ্রহণযোগ্য এবং মোডবাসের মতো কখন আমাকে আরও উন্নত কিছু বিবেচনা করা উচিত? বাণিজ্যিক ডিভাইসগুলি কি এএসসিআইআই ব্যবহার করে? শিল্প?


3
সংক্ষিপ্ত উত্তর: আপনার অ্যাপ্লিকেশন যখন এটি প্রয়োজন। হ্যাঁ, বাণিজ্যিক ডিভাইসগুলি ASCII ব্যবহার করে। উদাহরণস্বরূপ জিপিএস এনএমইএ নিন। (এবং আবার আমি নিজের প্রশ্নটি এখানে উল্লেখ করব )
ইউজিন শ।

1
মোডবাসের একটি এএসসিআইআই মোড রয়েছে। দেখুন Modicon Modbus প্রোটোকল রেফারেন্স গাইড
Tut

@ ইউজিনিশ: এটি লক্ষণীয় যে এনএমইএর একটি চেকসাম ক্ষেত্র রয়েছে, এবং চেকসাম ব্যর্থতার কারণে একক নমুনা ফাটিয়ে ফেলা (যা আপনার মনে হতে পারে প্রায়শই ঘটে) সাধারণত একটি গুরুত্বপূর্ণ ব্যর্থতা নয়। অন্য প্রোটোকলের ক্ষেত্রে এটি খুব ভাল নাও হতে পারে ... এবং অ্যাপ্লিকেশনগুলির জন্য এটি প্রচুর পরিমাণে বাইনারি জিপিএস প্রোটোকল ব্যবহার করা হয় (যেমন গারমিন) যা এটি সত্যই সমালোচনামূলক হতে পারে (বা যেখানে 1-হার্জ-এর চেয়ে বেশি 1 হার্জ নমুনার হার হয়) প্রয়োজনীয়, যার জন্য এনএমইএ খুব ভার্জোজ)। যদিও এটি সত্যই আপনার পয়েন্টটি দৃif় করে।
মনিকা 20'15

উত্তর:


28
  1. এএসসিআইআই এবং সিআরসি পারস্পরিক একচেটিয়া নয়। এএসসিআইআই একটি এনকোডিং এবং সিআরসি ত্রুটি পরীক্ষা করার জন্য checking

  2. যে কোনও কিছুই ASCII হিসাবে প্রেরণ করা যায়। আমাদের পুরাতনরা অবশ্যই ইউইউএনকোডিংয়ের কথা মনে রাখে যা কোনও কিছুকে ASCII স্ট্রিংয়ে রূপান্তর করে।

  3. ক) আমার জন্য, এটি সাধারণত গতি এবং দক্ষতার প্রশ্ন। ASCII দ্বারা একটি বৃহত 32-বিট নম্বর প্রেরণে দীর্ঘ সময় নিতে পারে তবে এটি সিরিয়াল প্রোটোকলের মাধ্যমে বাইনারি হিসাবে পাঠাতে কেবল 4 বাইট লাগে।

    খ) ASCII এর মাধ্যমে নম্বর প্রেরণের অর্থ হল যে আপনাকে নম্বরটি ASCII তে রূপান্তর করতে হবে, এটি একটি স্পষ্ট অতিরিক্ত পদক্ষেপ (এটি "প্রিন্টফ" কী করে তার অংশ)।

  4. আপনি যদি কোনওভাবে নিজের জায়গাটি হারিয়ে ফেলেন, স্ক্রু আপ করুন, ফর্ম্যাটটি হারাবেন, ভুল এন্ডিয়ান পাবেন, ইত্যাদি, বাইনারি যোগাযোগ প্রোটোকল অবশ্যই স্ক্রু আপ করতে পারে। আপনি যদি ASCII প্রেরণ করছেন তবে ডেটা স্ট্রিমে সন্ধান এবং অনুসন্ধান করে স্ক্রুআপগুলি থেকে পুনরুদ্ধার করা আরও সহজ।


12
"ASCII একটি এনকোডিং" এর জন্য +1। এটি কোনও প্রোটোকল নয়; প্রোটোকলগুলি ASCII এর উপরে নির্মিত যেতে পারে।
পিট বেকার 16

8
কোনও স্ক্রুআপ থেকে স্বয়ংক্রিয়ভাবে পুনরুদ্ধার কোনও বাইনারি হিসাবে কোনও পাঠ্য-ভিত্তিক প্রোটোকলের পক্ষে অভ্যন্তরীণভাবে সহজতর কিছু নয়, তবে এটি নিরীক্ষণ এবং ডিবাগিং অবশ্যই ব্রণ হতে পারে।
নিক জনসন

1
@ নিক জোনসন - একেবারে আপনি কী পুনরুদ্ধার করতে পারবেন তা দেখার জন্য আপনি একবার হেক্স সম্পাদকের একটি ফাইল খোলার পর্যায়ে এসেছেন, আপনি এসওপি-র কাছে এতক্ষণে ফুবারে রয়েছেন
স্কট সিডম্যান

1
@ নিকজোহনসন যে সত্যই সত্য নয়। সিঙ্ক্রোনাইজেশন এবং পুনরুদ্ধারের সহায়তায় ASCII আপনাকে প্রচুর পরিমাণে ব্যান্ড ফ্রেমিং / ডিলিমিটার বিকল্প সরবরাহ করে, যার জন্য অতিরিক্ত চলা, বিট স্টাফিং, সময়ের ব্যবধান বা অন্যান্য কৌশলগুলির প্রয়োজন হবে যদি চ্যানেলটি পূর্ণ প্রস্থের বাইনারি ডেটার জন্য ব্যবহার করা হয়।
ক্রিস স্ট্রাটন

2
সমস্ত সুস্পষ্ট সুবিধার জন্য (পাঠযোগ্যতা, লগিব্যালিটি, ইত্যাদি) প্রোটোকল লেখার সময় আমি সর্বদা ASCII এর পক্ষে থাকি। আছে দুই ক্ষেত্রেই যখন বাইনারি তোলে আরো ইন্দ্রিয়: প্রথম, গতি একটি বিষয় এবং আপনার স্ট্রীমে যতটা সম্ভব তথ্য হিসাবে ঠুসা বাইনারি প্রয়োজন, এবং দ্বিতীয়, সীমিতভাবে, যদি আপনি ইচ্ছাকৃতভাবে অস্পষ্ট বা এমনকি ডেটা এনক্রিপ্ট করার চেষ্টা করছেন যদি বিপরীত ইঞ্জিনিয়ারিং বাধা বা প্রতিরোধ প্রবাহ। সেই সময়ে, আমি বাইনারি প্রোটোকলগুলি বিপরীত করেছি এবং এটি আসলে আইনটিকে রোধ করার চেয়ে বেশি মাত্রায় আমাকে বিরক্ত করেছে।
জে ...

10

এটি সম্পর্কে কিছু ধারণা দেওয়া হয়েছে:

  • ASCII দুর্দান্ত কারণ আপনি যা পাঠাচ্ছেন তাতে ম্যানুয়াল চেহারা পেতে সিরিয়াল মনিটর ব্যবহার করতে পারেন।
  • যদি আপনার সংযোগটি নির্ভরযোগ্য না হয় তবে আপনাকে অবশ্যই সংক্রমণ-ত্রুটিগুলি আশা করতে হবে এবং প্রতিটি প্রাপ্ত বার্তার সত্যতা যাচাই করতে একটি সিআরসি ব্যবহার করা উচিত। এটি ASCII বার্তাগুলিতেও করা যেতে পারে।
  • যদি আপনার সংযোগটি খুব ধীর হয় তবে আপনি বাইনারি বিন্যাসে স্যুইচ করে আপনার বার্তাগুলির আকার হ্রাস করতে পারেন
  • একটি বিশেষায়িত বাইনারি ফর্ম্যাটটি ASCII এর চেয়ে রিসিভার দিকে ডিকোড করা সহজ হতে পারে

7

সহজ স্তরে আপনি বলতে পারেন যে একটি সাধারণ যোগাযোগ প্রোটোকলের তিনটি স্তর রয়েছে: শারীরিক, পরিবহন এবং অ্যাপ্লিকেশন। (এমন আরও কয়েকটি মডেল রয়েছে যেমন OS এর সাথে ওএসআই বা ৪ টি সহ টিসিপি / আইপি রয়েছে) এই প্রশ্নের প্রসঙ্গে স্তরগুলির সংখ্যা মারাত্মকভাবে গুরুত্বপূর্ণ নয়)

অ্যাপ্লিকেশন স্তর হ'ল স্তর যা আপনার কোডে সরাসরি মোকাবেলা করে এবং প্রশ্নের কেন্দ্রবিন্দু। ট্রান্সপোর্ট লেয়ারটি যতদূর যায়, সেন্ড_ডেটায় আপনি যে বাইটটি দিয়েছিলেন তা কেবল একটি বাইনারি প্যাটার্ন তবে এটি আপনি আপনার অ্যাপ্লিকেশন কোডটিতে 'এ' অক্ষর হিসাবে ব্যাখ্যা করতে পারেন। আপনি বাইটটিকে 'এ,' 0x41, বা 0 বি01000001 হিসাবে বিবেচনা না করেই সিআরসি বা চেকসাম গণনা সমান হবে।

ট্রান্সপোর্ট লেয়ারটি হ'ল প্যাকেট স্তর, যেখানে আপনার বার্তা শিরোনাম রয়েছে এবং ত্রুটি যাচাই করে তা সিআরসি হোক বা বেসিক চেকসাম হোক। ফার্মওয়্যার প্রসঙ্গে আপনার সেন্ড_ডাটা এর মতো একটি ফাংশন থাকতে পারে যেখানে আপনি এটি বাইট পাঠাতে পাঠান pass এই ফাংশনের অভ্যন্তরে এটি একটি প্যাকেটে রাখে যা বলে যে "আরে এটি একটি সাধারণ বার্তা, একটি স্বীকৃতি প্রয়োজন, এবং চেকসাম 0x47, বর্তমান সময় এক্স X" এই প্যাকেটটি রিসিভিং নোডে শারীরিক স্তরের উপরে প্রেরণ করা হয়।

বৈদ্যুতিন স্তর এবং ইন্টারফেসটিকে সংজ্ঞায়িত করা হয়: সংযোগকারী, ভোল্টেজের মাত্রা, সময় ইত্যাদি etc. বাস্তবায়ন করতে পারেন

রিসিভিং নোডে, প্যাকেটটি শারীরিক স্তরে আসে, ট্রান্সপোর্ট লেয়ারে আনপ্যাক করা হয় এবং তারপরে আপনার বাইনারি প্যাটার্নটি অ্যাপ্লিকেশন স্তরে পাওয়া যায়। সেই প্যাটার্নটিকে 'এ,' 0x41, বা 0 বি01000001 হিসাবে ব্যাখ্যা করা উচিত এবং এটি দিয়ে কী করা উচিত তা জানা নোড অ্যাপ্লিকেশন স্তরটি নির্ভর করে।

উপসংহারে, যদি অ্যাপ্লিকেশনটির প্রয়োজন হয় তবে এটি ASCII অক্ষরগুলি প্রেরণে বেশ সর্বদা গ্রহণযোগ্য। গুরুত্বপূর্ণ বিষয়টি হল আপনার যোগাযোগের স্কিমটি বোঝা, এবং একটি ত্রুটি পরীক্ষার ব্যবস্থা অন্তর্ভুক্ত করা উচিত।


আসকি প্রোটোকল পাশাপাশি চেকসাম অন্তর্ভুক্ত করতে পারে। আমি সংখ্যার আসকি উপস্থাপনা ব্যবহার করে হেক্স-অ্যাস-এসিআই প্রকরণের মুখোমুখি হয়েছি।
ইউজিন শ।

@EugeneSh। সেই বক্তব্যটি স্পষ্ট
ম্যাট ইয়ং

নিতপিক নয়, তবে টিসিপি চার স্তর নয়; এটি ওএসআই মডেলের চার স্তরের ফিট হিসাবে দেখা যায়। সিরিয়াল যোগাযোগগুলি ওএসআই মডেলটিকে খুব ভালভাবে ফিট করে না।
ব্যাটসপ্ল্যাটারসন

@ ব্যাটসপ্ল্যাটারসন এটি নিটপিক করছে এবং আমি যে পয়েন্টটি করছি তার পক্ষে এটি বেশ অপ্রাসঙ্গিক।
ম্যাট ইয়ং

5

এখনও উল্লেখ করা হয়নি এমন একটি বিষয় হ'ল যে কেউ এএসসিআইআই বা বাইনারি প্রোটোকল ব্যবহার করছে, প্রতিটি প্যাকেটের আগে একটি রব-আউট চরিত্র প্রেরণ করা নিশ্চিত করবে যে প্যাকেট শুরুর আগে লাইন শব্দ বা ফ্রেমিংয়ের ত্রুটি উপস্থিত থাকলেও, সমস্ত অক্ষর ঘষাঘটনের পরে- আরও গোলমালের অভাবে সঠিকভাবে ফ্রেম করা হবে be অন্যথায়, যদি কেউ ধারাবাহিকভাবে প্যাকেটগুলি প্রেরণ করে এবং পুনরায় সিনক্রোনোনাইজেশন অর্জনের গ্যারান্টিযুক্ত এমন কোনও অক্ষর অন্তর্ভুক্ত না করে, তবে এটি সম্ভবত সম্ভব যে সংক্রমণ পরবর্তী বিরাম না হওয়া পর্যন্ত অনুসরণকারী সমস্ত কিছুকে দূষিত করে। 0xFF অক্ষরটি দুর্দান্ত কারণ এটি গ্যারান্টি দেয় যে কোনও প্রাপক নিম্নলিখিত অক্ষরটির পুনরায় সংশ্লেষ করতে সক্ষম হবেন।

(*) 0 এক্সএফএফ - ডেকে আউট বলা হয় কারণ যে কেউ কাগজের টেপের উপর ডেটা টাইপ করার সময় একটি ভুল চরিত্র টাইপ করেন তিনি "পদক্ষেপ টেপ পিছনে" বোতামটি চাপতে পারেন এবং 0xFF এর সাহায্যে ভুল-পাঞ্চযুক্ত চরিত্রটি প্রতিস্থাপন করতে ঘষতে আউটটি চাপতে পারেন, বেশিরভাগ প্রাপকদের দ্বারা উপেক্ষা করা হবে)।


2

এএসসিআইআই স্ট্রিংগুলি প্রেরণের একটি সুবিধা হ'ল নিয়ন্ত্রণ কোডগুলি ম্যাসেজের শুরু / শেষের সংকেত দেওয়ার জন্য ব্যবহার করা যেতে পারে। যেমন এসটিএক্স (চর 2) এবং ইটিএক্স (চার 3) স্টার্ট ট্রান্সমিশন এবং শেষ সংক্রমণ সংকেত দিতে পারে। বিকল্পভাবে আপনি সংক্রমণের শেষ চিহ্নিত করতে একটি সাধারণ লাইন ফিড যুক্ত করতে পারেন।

বাইনারি ডেটা প্রেরণ করার সময় এটি আরও জটিল হয়ে যায় কারণ কোনও নির্দিষ্ট বিট প্যাটার্ন কোনও নিয়ন্ত্রণ কোডের জন্য সংরক্ষণ করা যায় না (কোনও অতিরিক্ত ওভারহেড বা জটিলতা ছাড়াই) বৈধ ডেটা বাইটের একই প্যাটার্ন থাকতে পারে।


3
অনেক বাইনারি প্রোটোকল নিয়ন্ত্রণ কোড হিসাবে এক বা একাধিক বিট নিদর্শন সংরক্ষণ করে তবে সেগুলিতে ডেটা উপস্থিত হওয়ার সাথে সাথে এই কোডগুলি পরিচালনা করার জন্য একটি পালানোর ব্যবস্থা অন্তর্ভুক্ত করে।
ডেভ টুইট করেছেন

আপনি বাইনারিটিতে যা চান তা পতাকাঙ্কিত করতে কোনও প্যাটার্ন সংরক্ষণ করতে পারেন। উদাহরণস্বরূপ, আমি দ্রুত ডেটা স্ট্রিম এবং একটি ধীরে ধীরে ডেটা স্ট্রিম একই ইউআরটার বাইরে চলে যাওয়া প্রকল্পগুলিতে আছি। আমি আমার ধীর ডেটার জন্য পতাকা হিসাবে বৃহত্তম negativeণাত্মক int32 সংরক্ষণ করেছি এবং সর্বাধিক নেতিবাচক + ১ এ আমার নেতিবাচক তথ্য পরিপূর্ণ করে রেখেছি
স্কট সিডম্যান

একমত। আমি সম্পাদিত উত্তরে এটি পরিষ্কার করে দিয়েছি, আশা করি।
ট্রানজিস্টর

2

এএসসিআইআই ঠিক আছে, আমি এটি প্রায় সমস্ত প্রকল্পে ব্যবহার করি। এটি বন্দর পর্যবেক্ষণের জন্য ডিবাগিংকে আরও সহজ করে তোলে এবং যদি প্রচুর ডেটা প্রেরণ করা হয় তবে এটি কেবল একটি সমস্যা হয়ে দাঁড়াবে।

আর একটি বোনাস, আমি আরডুইনোর মধ্যে বার্তা পেতে সিরিয়াল রেডিও ডিভাইসগুলি ব্যবহার করি এবং আমি আমার ল্যাপটপের সাথে সংযুক্ত একটি সিরিয়াল মনিটর ব্যবহার করতে পারি এবং নির্দিষ্ট কিছু ঘটতে বার্তাগুলি ইনজেক্ট করতে পারি। পরীক্ষার জন্য দুর্দান্ত।

এছাড়াও, বাইনারি হিসাবে জিনিসগুলি প্রেরণ করা ডিবাগ করা অসম্ভব নয় এবং আপনার সরঞ্জামগুলির উপর নির্ভর করে আপনি বাইনারিটি উত্তোলন করতে এবং মানব পাঠযোগ্য কিছুতে রূপান্তর করতে পারেন। অথবা আপনি যদি যা সন্ধান করছেন তা যদি আপনি জানেন তবে আপনি ড্যাটাস্ট্রিমটি চাক্ষুষরূপে পরিদর্শন করতে পারেন এবং মানগুলি কোথায় হওয়া উচিত তা সনাক্ত করতে পারেন এবং তত সহজেই ত্রুটি খুঁজে পাওয়া যায় না। যেমন, আপনি বাইটের ধরণগুলি চিনতে পারবেন এবং প্রত্যাশিত মানগুলি স্বীকৃতি পাবেন


2

মোডবাসের পরিবর্তে এইচডিএলসি বিবেচনা করুন । আপনি ত্রুটি সনাক্তকরণ (যা শোরগোলের সিরিয়াল লাইনে গুরুত্বপূর্ণ) পান। সিঙ্ক্রোনাইজেশন মজবুত, পালানো মজবুত।

আমি কোনও সমস্যা ছাড়াই আরএস -435 নেটওয়ার্কগুলিতে এইচডিএলসি ব্যবহার করেছি এবং পিপিপিও এটি ব্যবহার করে।


2
আপনি মোডবাসের উপরে কেন এটির পরামর্শ দিচ্ছেন তা যদি আপনি নির্দেশ করেন তবে ভাল লাগবে।
আমি জানিনা

1

ইউআরটি-র উপর ASCII আংশিকভাবে জনপ্রিয় কারণ:

  • এটি ডিবাগ করার সময় মানব পঠনযোগ্য (আমার কাছে এখনও এমন একটি যুক্তি বিশ্লেষক দেখতে পেল যা ASCII ডিকোড করে না)।

  • এটি বাস্তবায়ন করা খুব সহজ, আপনি দ্রুত গুগলের মাধ্যমে একটি ASCII টেবিল পেয়েছেন যা ভাল মানের।

  • এটি স্টার্ট / স্টপ বিটগুলির সাথে সিঙ্ক্রোনাইজেশন তৈরি করেছে।

  • খুব সুন্দর পুরো শখের বিশ্বটি সিরিয়ালের উপরে ASCII এর সাথে নিজেকে সেট আপ করেছে, সুতরাং যে কোনও নতুন পদ্ধতির সাথে এটি মোকাবেলা করতে হবে, এবং এটি কোনও উপায়েই সহজ নয়।

তারপরে আপনি এমন পরিস্থিতিতে পড়বেন যখন আপনি নির্দিষ্ট এনকোডিং প্রেরণ শুরু করবেন যেমন ASCII তে একটি ফ্লোটকে রূপান্তর করার তুলনায় একটি ফ্লোটের মেমরি উপস্থাপনাকে প্রেরণ করুন, সেই ওভার সিরিয়ালটি প্রেরণ করুন যা 4 বাইটের বেশি হতে পারে, এবং তারপরে সেটিকে রূপান্তর করুন back হোস্টে স্মৃতি উপস্থাপনের জন্য। পরিবর্তে, আপনি প্রতি বার মাত্র 4 বাইট উপস্থাপনা পাঠান। অবশ্যই, আপনি নিজেই এনকোডিংটি পরিচালনা করতে পারেন তবে তারপরে আপনার শুরু / শেষ ট্যাগ, অর্ডার ইত্যাদি সেট আপ করতে হবে

পরিবর্তে, প্রোটোবুফের মতো জিনিস ব্যবহার করা যেতে পারে। এটি আসলে আমি যে প্রকল্পে কাজ করছিলাম তাতে এটি ব্যবহার করা হয়েছিল এবং এটি অত্যন্ত উপকারী ছিল, এটি পরিবর্তনশীল দৈর্ঘ্যের বার্তা দেয়, আপনার জন্য এন্ডিয়ান এবং অন্যান্য কয়েকটি দুর্দান্ত বৈশিষ্ট্যগুলি পরিচালনা করে। এটি কোড আকারেও এত বড় নয় এবং আপনি স্টার্টআপের পরে সমস্ত কিছু স্থিতিশীলভাবে বরাদ্দ করতে পারবেন। আপনার যদি প্রয়োজন হয় তবে আপনাকে নিজেই চেকসামে ফেলে দিতে হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.