যোগাযোগগুলি একবারে এক দিকে থাকলে (যেমন অর্ধ-দ্বৈত যোগাযোগ) আপনি করতে পারেন এমন একটি ঝরঝরে কৌশল রয়েছে। উভয় পক্ষই একই সাথে একে অপরের সাথে কথা বললে এটি কার্যকর হবে না (সম্পূর্ণ দ্বৈত) তবে এটি যদি আপনার সাধারণ হয় তবে "এটি করুন" "ঠিক আছে প্রতিক্রিয়া এখানে" "এখন এটি করুন" "ঠিক আছে এখানে নতুন প্রতিক্রিয়া" যোগাযোগের ধরণ এটি বেশ ভাল কাজ করে।
যেহেতু ইউআরটি লিঙ্কটি যুক্তিযুক্ত উচ্চ (1) স্তরে ট্রান্সমিটারের নিষ্ক্রিয় শর্ত ব্যবহার করে আপনি একটি 2 ইনপুট এবং গেট ব্যবহার করবেন এবং প্রতিটি দিক থেকে টিএক্সকে একটি এবং ইনপুটটিতে সংযুক্ত করবেন। অ্যান্ড গেটের আউটপুট হ'ল আপনার স্নিফারের ইউআআআরটিতে এটি ইনপুট (এটি আরএক্স পিন)। এখন ডিভাইস বি এর টিএক্স লাইন নিন এবং এটিকে স্নিফারে আই / ও বন্দরে আনুন। এই পিনটি যখন উচ্চ থেকে নীচে যায় তখন আপনি কোনও বাধা তৈরির জন্য স্নিফারটি কনফিগার করবেন।
পুনরুদ্ধার করতে: ডিভাইসটি একটি ইউআরটি টিএক্স -> এবং গেট ইনপুট। ডিভাইস বি ইউআরটি টিএক্স -> অন্যান্য এবং গেট ইনপুট এবং স্নিফার জিপিআইও পিন। এবং গেটের আউটপুট -> স্নিফার ইউআরটি আরএক্স লাইন।
ইউআরটি যোগাযোগগুলিতে একটি স্টার্ট বিট, কিছু সংখ্যক ডেটা বিট, একটি optionচ্ছিক প্যারিটি বিট এবং এক বা একাধিক স্টপ বিট থাকে। নিষ্ক্রিয় অবস্থা যেহেতু লজিক উচ্চ (1), তাই প্রতিটি বাইট শুরু হওয়াটি একটি লজিক লো (0) হবে এবং স্নিফারটিতে থাকা বাধাটি আগুনে জ্বলবে। যখন আপনার স্নিফারটি আই / ওটি বাধাগ্রস্থ করছে ইউআআআআআআআআআআআরআরআরটিআরপিটি চালিত করার সময় ওআরএইচ গেট থেকে বিট সংগ্রহ করা হবে। যখন ইউআরটি স্টপ বিটটি পেয়েছে, ততক্ষণে আই / ও ইন্ট্র্রেট দীর্ঘ হয়ে যাবে এবং ইউআআরটি আরএক্স বিঘ্নিত গুলি চালিত হবে।
বাধা-অন-আইও-পরিবর্তন রুটিন যোগাযোগগুলি "বি-> এ" দিকের দিকে রয়েছে তা নির্দেশ করার জন্য একটি "দিকনির্দেশ" পরিবর্তনশীল সেট করবে। স্নিফার এর ইউআরটি বাধা প্রাপ্তি এই "দিকনির্দেশ" পরিবর্তনশীলটিকে দেখবে এবং উপযুক্ত বাফারে কেবল প্রাপ্ত-বাইটটি লিখবে। ইউআআআরটি আরএক্স বিঘ্নিত হলে "দিকনির্দেশ" পরিবর্তনশীলটি ডিফল্ট "এ-> বি" স্থিতিতে ফিরে আসবে:
volatile int direction = 0; /* 0 = A -> B */
void io_interrupt(void)
{
direction = 1; /* switch direction, now B -> A */
}
void uart_interrupt(void)
{
unsigned char b;
b = UART_RX_REG;
if(direction) {
store_byte_to_device_b_sniff_buffer(b);
} else {
store_byte_to_device_a_sniff_buffer(b);
}
direction = 0; /* reset direction to default A -> B */
}
এই কোডটি স্পষ্টতার জন্য এবং আপনি বাস্তব-বিশ্বের পরিস্থিতিতে কী লিখবেন তা অগত্যা নয় written ব্যক্তিগতভাবে আমি উপযুক্ত ফিফোর কাঠামোর দিকে "নির্দেশ" তৈরি করতাম তবে এটি সম্পূর্ণরূপে অন্য একটি অনুশীলন। :-)
ডিভাইস এ যখন আই / ও লাইনটি কথা বলছে তখন সরে না (ডিভাইসের বি এর ইউআরটি ট্রান্সমিটারটি নিষ্ক্রিয় হওয়ায় এটি একটি যুক্তি '1' এ রয়ে গেছে), এবং ইউআরটি আরএক্স বিঘ্নিত একটি বাইট পাবেন, দেখুন যে দিকটি A-> B , এবং সেই বাফারটিতে ডেটা সঞ্চয় করুন। ডিভাইস বি যখন কথা বলছে তখন আই / ও লাইনটি কম হয়ে যাবে যতক্ষণ না ডিভাইস বি ডেটা স্থানান্তরিত করতে শুরু করবে, এবং আই / ও বিঘ্নিত রুটিন নির্দেশ করে যে ডিভাইস বি কথা বলছে তা নির্দেশ করবে। সমস্ত বিট সংগ্রহ করার পরে অবশেষে ইউআআআরটি আরএক্স বিঘ্নিত হয়ে গুলি চালানো হবে এবং যেহেতু আমি / ও বাধা বিঘ্নিতভাবে সঠিকভাবে নির্দেশিকা রেজিস্টার স্থাপনের যত্ন নিয়েছে, প্রাপ্ত বাইটটি সঠিক বাফারে সংরক্ষণ করা হবে।
প্রেস্টো: কোনও বিট-ব্যঞ্জড ইউআআআরটি যোগাযোগ ছাড়াই স্নিফারে একটি ইউআআআআআরটি এবং আই / ও লাইন ধরে দুটি ডিভাইসগুলির মধ্যে অর্ধ-দ্বৈত যোগাযোগ।