কীভাবে আরডুইনো সিরিয়াল বাফারকে ওভারফ্লো করে? এটি কি সর্বাধিক আগত ডেটা ফেলে দেয় বা পুরানো? বাফার কয়টি বাইট ধরে রাখতে পারে?
কীভাবে আরডুইনো সিরিয়াল বাফারকে ওভারফ্লো করে? এটি কি সর্বাধিক আগত ডেটা ফেলে দেয় বা পুরানো? বাফার কয়টি বাইট ধরে রাখতে পারে?
উত্তর:
হার্ডওয়্যার সিরিয়াল পোর্টগুলি জন্য আপনি দেখতে পাবেন HardwareSerial.cpp যে বাফারের আকার নির্দিষ্ট এভিআর উপলব্ধ RAM- র পরিমাণ উপর নির্ভর করে আলাদা হয়:
#if (RAMEND < 1000)
#define SERIAL_BUFFER_SIZE 16
#else
#define SERIAL_BUFFER_SIZE 64
#endif
একটি সফ্টওয়্যার সিরিয়াল পোর্টের জন্য SoftwareSerial.h রিসিভার বাফারের আকার _SS_MAX_RX_BUFF
64 বাইট হিসাবে সংজ্ঞায়িত করা হয়। উভয় ক্ষেত্রেই এটি সম্পূর্ণ হওয়ার পরে কাতারে প্রাপ্ত ডেটা sertোকানোর চেষ্টা বন্ধ করে দেয়, সুতরাং আপনি কীভাবে সারি থেকে ডেটা পুনরুদ্ধার করছেন তার উপর নির্ভর করে আপনি পুরানো এবং নতুন ডেটাতে মিশ্রণ পেতে পারেন।
আদর্শভাবে বাফার ভর্তি এড়াতে বাফারটি সর্বদা একটি প্রম্পট পদ্ধতিতে খালি হয়ে যায় তা নিশ্চিত করা ভাল। আপনার সমস্যাটি মূল লুপটি ব্লক করা অন্যান্য কোডের সাথে সম্পর্কিত হলে টাইমার এবং সাধারণ স্টেট মেশিন বাস্তবায়ন করতে পারেন।
আপনি হার্ডওয়্যারশিয়ারের উত্স থেকে দেখতে পাচ্ছেন যে যদি আগত বাইটটি রিং বাফারটি পূর্ণ দেখতে পায় এটি বাতিল করা হয়:
inline void store_char(unsigned char c, ring_buffer *buffer)
{
int i = (unsigned int)(buffer->head + 1) % SERIAL_BUFFER_SIZE;
// if we should be storing the received character into the location
// just before the tail (meaning that the head would advance to the
// current location of the tail), we're about to overflow the buffer
// and so we don't write the character or advance the head.
if (i != buffer->tail) {
buffer->buffer[buffer->head] = c;
buffer->head = i;
}
}
আমি এই ধারণাটি পেয়েছি যে আমি যদি আরডুইনোতে ডেটা প্রেরণ করি এবং আরডুইনো সাইডে ডেটার একটি সক্রিয় "চালক" না রাখি তবে যদি বাফারে ফিট করার মতো আরও ডেটা আসে তবে তা বাতিল হয়ে যাবে। আপনি কি তা নিশ্চিত করতে পারবেন?
হ্যাঁ তা ফেলে দেওয়া হবে। আপনার নিজের প্রয়োগ না করা হলে কোনও সফ্টওয়্যার বা হার্ডওয়্যার ফ্লো নিয়ন্ত্রণ নেই।
তবে একটি 64৪-বাইট বাফার এবং 9600 বাউডে ডেটা পাওয়ার সাথে সাথে আপনি প্রতি 1.04 এমএসে একটি বাইট পাবেন এবং এভাবে বাফারটি পূরণ করতে 66.6 এমএস লাগবে takes একটি 16 মেগাহার্টজ প্রসেসরে আপনার বাফারটি যথেষ্ট পরিমাণে পূরণ হয় না যা এটি পূরণ করে না। আপনাকে এখনই যা করতে হবে তা হ'ল হার্ডওয়্যারশিরাল বাফার থেকে ডেটাটি আপনার নিজের দিকে সরিয়ে নেওয়া, যদি আপনি এখনই এটি প্রক্রিয়া করতে না চান।
আপনি #if (RAMEND < 1000)
চেক থেকে দেখতে পারবেন যে র্যামের 1000+ বাইট সহ প্রসেসরগুলি 64-বাইট বাফার পায়, এতে র্যাম কম 16-বাইট বাফার পাবে।
আপনি যে ডেটা লেখেন সেটি একই আকারের বাফারে (16 বা 64 বাইট) স্থাপন করা হয়। প্রেরণের ক্ষেত্রে যদি বাফার কোডগুলি "ব্লকগুলি" পূরণ করে যাতে সিরিয়াল বন্দরটি পরবর্তী বাইটটি প্রেরণ করার জন্য একটি বাধাগুলির জন্য অপেক্ষা করে।
যদি বাধা বন্ধ করা হয় তবে এটি কখনই ঘটবে না, সুতরাং আপনি কোনও বিঘ্নিত পরিষেবা রুটিনের ভিতরে সিরিয়াল প্রিন্টগুলি করবেন না ।
1/960 = 0.001042 s
- এটি প্রতি 1.04 এমএসে এক বাইট।