اطلاعیه

Collapse
No announcement yet.

بهم ریختگی دیتای دریافتی در کار با ماژول rf01d در کدویژن

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    بهم ریختگی دیتای دریافتی در کار با ماژول rf01d در کدویژن

    سلام من یک ماژول rf01d تهیه کردم و میخوام که کد ده رقمی روی کارت رو بخونم
    از این کد استفاده کردم
    gets(str,11
    lcd_puts(str)
    وقتی که فقط همین کد رو میزنم کد کارت رو درست میخونه ، فقط از دفعه دوم که کارت زده میشه اولش یه علامت اضافه میکنه
    مشکلی که هست اینه که وقتی دو خط به برنامم اضافه میکنم وقتی که میکرو به خوندن کارت میرسه اعداد رو قاطی میکنه
    اگه میشه راهنمایی کنید خیلی ممنون میشم
    ((میکروکنترلر من atmega 8 هستش و از مولد فرکانس داخلی استفاده کردم که روی 8 مگا هرتز تنظیم کردم ، همین تنظیمات رو روی پروتوس با همین برنامه اجرا میکنم هیچ مشکلی نداره ، ولی رو برد برد اطلاعات رو قاطی میکنه میکرو))
    جدیدترین ویرایش توسط amiraghamohamadi; ۱۵:۲۷ ۱۳۹۷/۰۴/۰۸.

    #2
    پاسخ : بهم ریختگی دیتای دریافتی در کار با ماژول rf01d در کدویژن

    کسی نمیدونه؟؟

    دیدگاه


      #3
      پاسخ : بهم ریختگی دیتای دریافتی در کار با ماژول rf01d در کدویژن

      سلام دوست عزیز....
      به نظرم دوحالت داره:
      1) این که توی برنامت , بافر یا اون حافظه ای که توش اطلاعات دریافت کارت رو میگیری و ذخیره میکنی , پاک نمیکنی و دیتای جدید که میاد, رو دیتای قبلی ذخیره میشه....
      2) این دوتا دستور و دستورات بعدی رو تو ی وقفه سریال نوشته باشی, (تو وقفه سریال اگه از دستوراتی مثل تاخیر , حلقه یا نمایش رو LCD استفاده کنی, دیتا به درستی دریافت نمیشه یا با خطا همراه هست...)

      دیدگاه


        #4
        پاسخ : بهم ریختگی دیتای دریافتی در کار با ماژول rf01d در کدویژن

        چجوری میتونم مشکلش رو حل کنم ؟
        1)چجوری اون بافر رو خالی کنم (چون چند روش امتحان کردم جواب نداد)
        2)پس این دستورات که میگی رو کجا بنویسم که با وقفه سریال تداخل نکنه و مدام مثل حلقه وایل تکرار بشه؟

        دیدگاه


          #5
          پاسخ : بهم ریختگی دیتای دریافتی در کار با ماژول rf01d در کدویژن

          سلام دوست عزیز
          اول وقفه مربوط به ارتباط سریال رو فعال کنید ,اینطوری هروقت دیتا روی پایه RX بیاد, یه وقفه اتفاق می افته و خودش دیتا رو دریافت میکنه و دیگه نیازی به توابعی مثل gets تو برنامه نیست...
          بعد از این که دیتا دریافت شد چیزی که احتیاج دارین , تعریف یک متغیر به صورت آرایه ( در اینجا اسم این متغیره به صورت دلخواه Receive ) هست و یه شمارنده و این که دیتا رو بریزه تو این متغیره....
          وقتی که وقفه RX فعال بشه, به ازای هر دیتای دریافتی, اطلاعات تو رجیستر UDR ذخیره میشه, حالا میتونی اون رو توی خانه های متغیر Receive که به صورت آرایه تعریف شده, ذخیره کنی و یه شمارنده به نام counter ( یا اسم دلخواه) بزاری که هربار با وقوع وقفه, یک واحد بهش اضافه میشه و باعث میشه هرسری دیتا تو خونه جدید از متغیر Receive, ذخیره شه....
          مثلا اگه 10 تا کاراکتر گرفتی, از خونه 0 تا 9 متغیر Receive پر میشه….
          اینم یه نمونه کد:


          unsigned char Receive[40]={0};
          unsigned char Buffer[40]={0};
          unsigned int counter=0;




          // USART Receiver interrupt service routine
          interrupt [USART_RXC] void usart_rx_isr(void)
          {
          unsigned char status,data;
          status=UCSRA;
          data=UDR;


          /*
          if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
          {
          rx_buffer[rx_wr_index]=data;
          if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
          if (++rx_counter == RX_BUFFER_SIZE)
          {
          rx_counter=0;
          rx_buffer_overflow=1;
          };
          };


          Receive[counter]=data;
          counter++;

          }
          // End of USART


          اون نکته که بهتون گفتم که ممکنه بافر یا حافظه اون دیتا پر بشه همینجاست , باید تو حلقه بی نهایت مقدار شمارنده رو صفر کنید که اگه دوباره دیتای جدید اومد, بیاد دوباره از اول تو خونه صفر شروع کنه بریزه,
          اگه مقدار شمارنده صفر نشه (چون از قبل مقدار داره) , میره از خونه های دیگه (مثا از خونه دهم) شروع میکنه به ریختن و دیتاهای قبلی هنوز تو خونه های قبلی ذخیره شدن و ممکنه توی دستورات نمایشگر دیده شن...
          حالا که دیتا رو به این روش گرفتی, الان به تک تک کاراکترها دسترسی داری و میتونی فرمان های و یا کارهای کنترلی مد نظرت رو تو این حلقه بی نهایت بنویسی...
          واسه نمایش هم, بیا تو همین حلقه بی نهایت و دستوراتی که واسه نمایش به کار میبردی رو اونجا بنویس....
          اینم یه نمونه کد دیگه واسه نمایش....
          نکته آخر این که طول یا تعداد خانه های آرایه متغیری که واسه دریافت دیتا میزاین( مثلا در اینجا طول متغیر Receive چهل هست), حتما زیادتر از تعداد دیتای دریافتی باشه که یه موقع سرریز رخ نده, اینم جزو مواردی هست که رعایت نکردن اون ,میتونه باعث خطا و بهم ریختگی در نمایش اطلاعات باشه....






          while (1)


          {


          counter=0;


          lcd_clear();
          lcd_gotoxy(0,0);
          lcd_putsf("Data is:\n");
          sprintf(Buffer,"%c%c%c%c%c%c%c%c%c",
          Receive[0],Receive[1],Receive[2],Receive[3],Receive[4]
          Receive[5],Receive[6],Receive[7],Receive[8],Receive[9]);
          lcd_puts(Buffer);
          delay_ms(1000);




          }
          جدیدترین ویرایش توسط Hamidreza.BRZ; ۲۳:۰۶ ۱۳۹۷/۰۴/۱۰. دلیل: اصلاح غلط املایی

          دیدگاه

          لطفا صبر کنید...
          X