ورود به حساب ثبت نام جدید فراموشی کلمه عبور
برای ورود به حساب کاربری خود، نام کاربری و کلمه عبورتان را در زیر وارد کرده و روی «ورود به سایت» کلیک کنید.





اگر فرم ثبت نام برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.









اگر فرم بازیابی کلمه عبور برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.





کاربران برچسب زده شده

نمایش نتایج: از 1 به 9 از 9
  1. #1
    2012/08/03
    295
    2

    چطور چند کاراکتر از وقفه 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. #2
    2012/08/03
    295
    2

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

    کسی نیست ؟
  3. #3
    2009/09/27
    1,128
    42

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

    کد:
    s=UDR;
    UDR=s;
    اين چه کاريه ؟ ميخواهيد همون چيزي که گرفتيد رو بفرستيد ؟؟
    شما اول بزاريد آرايه تون پر بشه. تا اينجا رو انجام دادي. در ضمن اون اول شرط بزاريد که اگر m==0 بود و آرايه دريافتي اول 1 بود، بره و بقيه آرايه رو پر کنه.
    بعد وقتي که پر شد، يک فلگ رو ست کنيد و تو حلقه وايل ازش استفاده کنيد.
    براي مقايسه هم مي توني از حلقه for استفاده کني و هم مي توني از توابع کدويژن مثل strcomp (اگه اشتباه نکنم) استفاده کني.
    ---------
    .
    .
    ...........
  4. #4
    2009/10/21
    تهران
    2,517
    217

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

    نميدونم ميدونيد صف حلقوي يعني چي يا نه؟ (اين همون چيزيه كه كدويزارد كدويژن مثلا براي بافر پورت سريال چه گيرنده و چه فرستنده ايحاد ميكنه)
    شما هر كاراكتر رو كه ميگيريد به انتهاي اين صف (كه خب اينجا ميتونه 4 بايتي يا بيشتر باشه) اضافه ميكنيد. بعد از ابتداي صف شروع ميكنيد به مقايسه با اون عدد دلخواه
  5. #5
    2009/10/10
    244
    4

    پاسخ : چطور چند کاراکتر از وقفه 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. #6
    2012/08/03
    295
    2

    پاسخ : چطور چند کاراکتر از وقفه 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. #7
    2009/10/10
    244
    4

    پاسخ : چطور چند کاراکتر از وقفه 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. #8
    2009/10/10
    244
    4

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

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

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

    دوستان تشکر کمه . واقعا ممنون . کارم رو راه انداختید . خیلی خیلی ممنون.
    :wow: :wow: :wow: :wow: :wow: :wow: :wow: :wow: :wow: :wow: :wow: :wow:
نمایش نتایج: از 1 به 9 از 9

موضوعات مشابه

  1. دریافت کاراکتر از وقفه usart و ارسال ش با وقفه spi
    توسط davoud.arabee در انجمن برنامه نویسی و اینترفیس
    پاسخ: 5
    آخرين نوشته: 2016/04/01, 21:42
  2. دریافت کاراکتر از وقفه SPi
    توسط davoud.arabee در انجمن برنامه نویسی و اینترفیس
    پاسخ: 3
    آخرين نوشته: 2016/02/13, 10:53
  3. وقفه رو براي UART چطور راه اندازي کنم؟
    توسط gbg در انجمن پروسسورهای ARM
    پاسخ: 3
    آخرين نوشته: 2014/06/01, 08:55
  4. خارج شدن از وقفه دریافت UART
    توسط soodi در انجمن NXP
    پاسخ: 11
    آخرين نوشته: 2014/03/09, 17:43
  5. پاسخ: 4
    آخرين نوشته: 2010/08/13, 10:55

کلمات کلیدی این موضوع

علاقه مندي ها (Bookmarks)

علاقه مندي ها (Bookmarks)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •