اطلاعیه

Collapse
No announcement yet.

دریافت دیتا 14 بایتی

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

    دریافت دیتا 14 بایتی

    سلام، من میخوام یه دیتا 14 بایتی رو از طریق سریال میکرو دریافت و ذخیره کنم
    من فقط 8 بیت اول رو میتونم، میشه راهنمایی کنید
    هم با وقفه سریال و هم بدون اون :nice:
    با تشکر :redface:

    #2
    پاسخ : دریافت دیتا 14 بایتی

    لریشو که بگیم اینطوری میشه: شما 14 تا بایت قراره تحویل بگیری پس 14 بار یک بایت رو تحویل بگیر!
    در حالت خیلی ساده روال خوندن یک بایت رو 14 مرتبه صدا بزن تا 14 بایت بگیری. اما همینطور که جلو میری ممکنه با پیش اومدن یک سری ایرادات بایت هایی رو گم کنی اینجور مواقع باید پروتکل ارتباطی تعریف کنی و پای زمانبندی رو وسط بکشی تا این تیپ مشکلات هم پیش نیاد. اما بطور کلی بیشتر به نوع اطلاعاتی که تبادل میکنی و ریتم ارسال و دریافت داده ات برمیگرده.
    جدای از این مسئله توصیه میکنم حتما از فرم وقفه ای استفاده کن چون دریافت داده رو از سرعت اجرای کد برنامه ات مستقل میکنه وگرنه همیشه باید بتونی گارانتی کنی که حداکثر زمان اجرای یک کد بین دریافت دو بایت متوالی از حد خاصی بیشتر نمیشه و این یه کمی دستتو میبنده.

    دیدگاه


      #3
      پاسخ : دریافت دیتا 14 بایتی

      سلام به نظر شما اگه تو وقفه سریال اینو بنویسم جواب میده
      i++;
      if(i==0)
      data=data2[0];
      else if(i==1)
      data=data2[1];
      else if(i==2)
      data=data2[2];
      else if(i==3)
      data=data2[3];
      else if(i==4)
      data=data2[4];
      else if(i==5)
      data=data2[5];
      else if(i==6)
      data=data2[6];
      else if(i==7)
      data=data2[7];
      else if(i==8)
      data=data2[8];
      else if(i==9)
      data=data2[9];
      else if(i==10)
      data=data2[10];
      else
      i=0;

      دیدگاه


        #4
        پاسخ : دریافت دیتا 14 بایتی

        اینطوری که گفتین هم میشه ولی شاید این کد راحتتر باشه:



        static unsigned char *tosend;
        static unsigned int n_tosend;

        void receive_isr(void)
        {
        if( n_tosend )
        {
        n_tosend--;
        UDR = *tosend;
        }
        }

        void send(void *buf, int size)
        {
        unsigned char *p = (unsigned char *)buf;
        unsigned char first;

        if( size == 0 )
        return;

        first = *p++;
        size--;
        if(size)
        {
        tosend = p;
        n_tosend = size;
        }
        UDR = first;
        }



        البته این کد خیلی ساده هست و مسلما در شرایط خاصی مشکل پیش میاره. اگر دوست داشتین بگین یک کد کامل و البته یه کمی پیچیده تر براتون بذارم.

        دیدگاه


          #5
          پاسخ : دریافت دیتا 14 بایتی

          سلام
          من میخوام بدونم اگه وقفه سریال رو فعال کنم و 8 بیت دریافت کنم
          با اون کدی که نوشتم اصلا جواب نمیده؟ یا جواب میده؟

          دیدگاه


            #6
            پاسخ : دریافت دیتا 14 بایتی

            دقیقا اون کد نمیدونم. چون معلوم نیست data چیه! فکر کنم با کد ویژن مینویسین و این data همون محتوای UDR مربوطه باشه؟؟ اگر اینطوری باشه این کد بطور تئوری کار میکنه اما در عمل ممکنه مشکل پیش بیاد چون اگر یک بایت پس و پیش بشه (مثلا میکروی گیرنده بعد از ارسال بایت دوم توسط میکروی اول شروع به کار کنه) این روتین با وجود درست بودن اصلا کار نمیکنه. این همون مورد خاصیه که عرض کردم. تازه شما 14 بایت داشتین این 11 بایته. بعدش هم فکر کنم خیلی چیز با حالی نشه. چون همینجا دارین بایت صفر تا 10 رو میفرستین و معلوم نیست قبل از این چه اتفاقی میفته.

            دیدگاه


              #7
              پاسخ : دریافت دیتا 14 بایتی

              سلام
              از اینکه سوسلاتم رو جواب دادد ممنونم
              مدار فرستنده یک ماژول RFID هستش،که تو دیتاشیتش نوشته 14 بایت رو موقع زدن کارت ارسال میکنه،همین
              ننوشته که مدت زمان بین هر بایت چقدره!

              https://www.rapidshare.com/#!download|933|4281101015|GHAEM.pdf|609.224

              دیدگاه


                #8
                پاسخ : دریافت دیتا 14 بایتی

                http://www.jk-sensor.com/default.aspx?PID=RFID&GuidPage=4DA29B2C-E542-442F-AB6F-EE3B68478535&GuidLanguage=B52185A0-3B16-4E08-B4E9-3DAEF8DF07A2&GuidPageTitle=FC3F9DF6-2053-4B73-87B4-32FA32A0D7C9


                این یکیشو دانلود کنید
                CONTACTLESS RFID READER

                دیدگاه


                  #9
                  پاسخ : دریافت دیتا 14 بایتی

                  یک چک راحت میتونین انجام بدین. اولا چون شناسایی یک تگ با فاصله های زمانی نسبتا زیادی انجام میشه (وسط مسیر تظاهرات که این دستگاه رو کار نمیذارین که!) بین دریافت دو تا فریم کلی وقت طول میکشه مثلا حداقل 50 میلی ثانیه. ثانیا اگر 14 بایت گرفتین و اولش 0x02 نبود و یا آخرش 13 و 10 و 3 نبود پس یه جای کار میلنگه. همه چی رو دور بریزین و اینقدر بایت ها رو بخونین تا به 2 برسین. اینجوری عملا میزان بروز خطا رو تا حد زیادی پایین میارین.

                  ضمنا وقت کردین به openrfid هم یک سری بزنین. کار چند تا هندی هست و در code.google میتونین پیداش کنین ولی متاسفانه از اون طرف فیل خیسه.

                  دیدگاه

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