اطلاعیه

Collapse
No announcement yet.

چطور چند کاراکتر از وقفه uart دریافت کنم ؟

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

    چطور چند کاراکتر از وقفه uart دریافت کنم ؟

    سلام دوستان .
    چطوری میشه چند کاراکتر از پورت سریال (با وقفه) دریافت کرد ؟ و با یک کد ثابت مثلا "123456" مقایسه اش کرد ؟
    این کد رو خودم نوشتم :
    کد:
    interrupt [USART_RXC] void usart_rx_isr(void)
    {
    
    
    
    
    s=UDR;
    UDR=s;
    k[m]=s;
    m++;
    
    
    
    if(m==4){
     v=atoi(k); 
    for(m=0;m<4;m++){
    time_out=0;
    }
    
    for(m=0;m<5;m++){
     k[m]=NULL;
     
    }
    m=0;
    
    }
    
    
    
    
    }

    ولی مشکل اساسی داره :
    اولا مثلا اگه قرار باشه در صورتی که رشته ارسالی عدد 1234 باشد یک پین میکرو یک شود و رشته ارسالی به هر دلیل عدد 123 شود عدد 123 در متغییر k ذخیره میشود و اگر مجددا رشته 1234 ارسال شود متغییر k ابتدا مقدار 1231 و سپس مقدار 234 را میگیرد . و این روند همچنان ادامه پیدا میکند و در صورتی که کد 1234 ارسال شود قادر به تشخیص نخواهد بود . (در ضمن رشته های ارسالی با فواصل کوتاه ارسال میشوند)


    لطفا کمک کنید .

    خلاصه:
    به کدی نیاز دارم که در صورت دریافت کد 1234 یک پین 1 و در صورت دریافت کد 123456 همان پین 0 شود .

    ممنون.

    #2
    پاسخ : چطور چند کاراکتر از وقفه uart دریافت کنم ؟

    کسی نیست ؟

    دیدگاه


      #3
      پاسخ : چطور چند کاراکتر از وقفه uart دریافت کنم ؟

      کد:
      s=UDR;
      UDR=s;
      این چه کاریه ؟ میخواهید همون چیزی که گرفتید رو بفرستید ؟؟
      شما اول بزارید آرایه تون پر بشه. تا اینجا رو انجام دادی. در ضمن اون اول شرط بزارید که اگر m==0 بود و آرایه دریافتی اول 1 بود، بره و بقیه آرایه رو پر کنه.
      بعد وقتی که پر شد، یک فلگ رو ست کنید و تو حلقه وایل ازش استفاده کنید.
      برای مقایسه هم می تونی از حلقه for استفاده کنی و هم می تونی از توابع کدویژن مثل strcomp (اگه اشتباه نکنم) استفاده کنی.
      ---------
      .
      .
      ...........

      دیدگاه


        #4
        پاسخ : چطور چند کاراکتر از وقفه uart دریافت کنم ؟

        نمیدونم میدونید صف حلقوی یعنی چی یا نه؟ (این همون چیزیه که کدویزارد کدویژن مثلا برای بافر پورت سریال چه گیرنده و چه فرستنده ایحاد میکنه)
        شما هر کاراکتر رو که میگیرید به انتهای این صف (که خب اینجا میتونه 4 بایتی یا بیشتر باشه) اضافه میکنید. بعد از ابتدای صف شروع میکنید به مقایسه با اون عدد دلخواه

        دیدگاه


          #5
          پاسخ : چطور چند کاراکتر از وقفه uart دریافت کنم ؟

          نوشته اصلی توسط m e h r d a d
          سلام دوستان .
          چطوری میشه چند کاراکتر از پورت سریال (با وقفه) دریافت کرد ؟ و با یک کد ثابت مثلا "123456" مقایسه اش کرد ؟
          این کد رو خودم نوشتم :
          کد:
          interrupt [USART_RXC] void usart_rx_isr(void)
          {
          
          
          
          
          s=UDR;
          UDR=s;
          k[m]=s;
          m++;
          
          
          
          if(m==4){
           v=atoi(k); 
          for(m=0;m<4;m++){
          time_out=0;
          }
          
          for(m=0;m<5;m++){
           k[m]=NULL;
           
          }
          m=0;
          
          }
          
          
          
          
          }

          ولی مشکل اساسی داره :
          اولا مثلا اگه قرار باشه در صورتی که رشته ارسالی عدد 1234 باشد یک پین میکرو یک شود و رشته ارسالی به هر دلیل عدد 123 شود عدد 123 در متغییر k ذخیره میشود و اگر مجددا رشته 1234 ارسال شود متغییر k ابتدا مقدار 1231 و سپس مقدار 234 را میگیرد . و این روند همچنان ادامه پیدا میکند و در صورتی که کد 1234 ارسال شود قادر به تشخیص نخواهد بود . (در ضمن رشته های ارسالی با فواصل کوتاه ارسال میشوند)


          لطفا کمک کنید .

          خلاصه:
          به کدی نیاز دارم که در صورت دریافت کد 1234 یک پین 1 و در صورت دریافت کد 123456 همان پین 0 شود .

          ممنون.
          کاری که من این جور مواقع انجام میدم اینه:
          مثلا فرض کنید دنبال رشته start هستم

          کد:
          volatile char my_buffer[7];
          volatile unsigned char j=0;
          interrupt [USART_RXC] void usart_rx_isr(void)
          {
          unsigned int i;
          char data;
          data=UDR;
          if(!start_flag)
            {
            for(i=0;i<=5;i++)  my_buffer[6-i]=my_buffer[6-i-1];
            my_buffer[0]=data;
            if((my_buffer[0]=='t')&&(my_buffer[1]=='r')&&(my_buffer[2]=='a')&&(my_buffer[3]=='t')&&(my_buffer[4]=='s'))
              {      
          کد مد نظر
              }
          }
          پی نوشت: بافر همین جوری یکم بزرگتر تعریف شده
          افتادگی آموز اگر طالب فیضی هرگز نخورد آب زمینی که بلند است

          دیدگاه


            #6
            پاسخ : چطور چند کاراکتر از وقفه uart دریافت کنم ؟

            آقا واقعا ممنون. :wow:
            کاری که من این جور مواقع انجام میدم اینه:
            مثلا فرض کنید دنبال رشته start هستم
            من دقیقا دنبال همین کار هستم. یعنی من دنبال رشته هایی مثل start و ... هستم .

            فقط چند تا سوال از این کد :
            کد:
            volatile char my_buffer[7];
            volatile unsigned char j=0;
            interrupt [USART_RXC] void usart_rx_isr(void)
            {
            unsigned int i;
            char data;
            data=UDR;
            if(!start_flag)
              {
              for(i=0;i<=5;i++)  my_buffer[6-i]=my_buffer[6-i-1];
              my_buffer[0]=data;
              if((my_buffer[0]=='t')&&(my_buffer[1]=='r')&&(my_buffer[2]=='a')&&(my_buffer[3]=='t')&&(my_buffer[4]=='s'))
                {      
            کد مد نظر
                }
            }

            تو این خط :

            کد:
            if(!start_flag)
            این متغییر کی و کجا مقدار میگیره ؟

            و معنی این خط چیه ؟

            کد:
            my_buffer[6-i]=my_buffer[6-i-1

            اگه امکانش هست یکم در مورد کد توضیح بدید.


            دیدگاه


              #7
              پاسخ : چطور چند کاراکتر از وقفه uart دریافت کنم ؟

              نوشته اصلی توسط m e h r d a d
              آقا واقعا ممنون. :wow:من دقیقا دنبال همین کار هستم. یعنی من دنبال رشته هایی مثل start و ... هستم .

              تو این خط :

              کد:
              if(!start_flag)
              این متغییر کی و کجا مقدار میگیره ؟

              و معنی این خط چیه ؟

              کد:
              my_buffer[6-i]=my_buffer[6-i-1

              اگه امکانش هست یکم در مورد کد توضیح بدید.
              این کد رو از داخل یکی از برنامه هام کپی کردم این سطر رو یادم رفته پاک کنم
              این جور فلق ها رو واسه این تعریف میکنم که بعد از شناسایی مثلا start در داخل برنامه مربوطه ستش کنم تا تو یه جای دیگه از برنامه یه استفاده ای ازش بشه. مربوط به این مثالی که واستون زدم نیست


              این خط داده های بافر رو یکی به چپ شیفت میده مثلا داده موجود در my_buffer[5] رو در my_buffer[6] و داده موجود در my_buffer[4] رو در my_buffer[5] و .. قرار میده و در نهایت داده جدید رو در my_buffer[0] میذاره
              بعد هم چک میکنه که آیا حروف کلمه start پشت سر هم وارد شدن یا نه
              افتادگی آموز اگر طالب فیضی هرگز نخورد آب زمینی که بلند است

              دیدگاه


                #8
                پاسخ : چطور چند کاراکتر از وقفه uart دریافت کنم ؟

                توضیح تکمیلی برای start_flag:
                این فلق رو قبل از روتین وقفه تعریف میکنم و پیش فرض ریستش میکنم و وقتی start شناسایی شد داخل روتین ستش می کنم(همون جایی که نوشتم "کد مد نظر&quot و بقیه داده ها رو مستقیم میگیرم یعنی واسه همون if(!start_flag) یه else میذارم و تو else بقیه دیتا رو می گیرم و عملیات مد نظر رو انجام میدم بعد که کارم با بقیه دیتا تموم شد تو همون else این فلق رو ریست می کنم تا برنامه مجددا منتظر start بعدی باشه.
                این کارا رو به دو دلیل انجام میدم:
                یکی مقاوم کردن برنامه مقابل نویز و یکی هم تشخیص اینکه دیتا ورودی به چه منظوری داره میاد (مثلا دیتا مربوط به یه موتوره یا مقادیری که باید به یه dac ارسال بشه و ...)
                البته دنبال بهینه سازی کد ، افزایش سرعت و ... نرفتم چرا که تو کاربردایی که استفاده کردم خیلی خوب جواب داده
                افتادگی آموز اگر طالب فیضی هرگز نخورد آب زمینی که بلند است

                دیدگاه


                  #9
                  پاسخ : چطور چند کاراکتر از وقفه uart دریافت کنم ؟

                  دوستان تشکر کمه . واقعا ممنون . کارم رو راه انداختید . خیلی خیلی ممنون.
                  :wow: :wow: :wow: :wow: :wow: :wow: :wow: :wow: :wow: :wow: :wow: :wow:

                  دیدگاه

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