اطلاعیه

Collapse
No announcement yet.

مشکل با ارسال رشته در UART

Collapse
این موضوع بسته شده است.
X
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل با ارسال رشته در UART

    سلام
    من این برنامه رو برای ارتباط سریال(USART) نوشتم وتا وقتی عددم کمتر از 255 هست خوب کار میکنه واین منطقیه چون دستورات putc و getc بیشتر از 8 بیت رو ارسال نمی کنن. اما من می خوام اعداد 4 رقمی یا بیشتر ارسال کنم واسه همین به نظرم اومد متغیر String بکار ببرم تا بتونم از gets و puts استفاده کنم. من اول برنامه 3 رقمی رو می ذارم و بعد برنامه 4 رقمی رو ببینید اشکال کجاست که وقتی 4 رقمی میشه قاطی میکنه یه مشکل اساسی اینه که من اول دستور atoa متغیر 16 بیتی اینتجر قبول نمیکنه که ما هم میایم و متغیر مون رو 32 بیتی تعروف می کنیم ولی بعدش هم باز کار نمیکنه
    برنامه با متغیر 8 بیتی:
    //to in barnameba keyboard 1 adad be micro ye aval midim va badaz
    //ersal ba protocol UART roye microye dovom namayesh dade mishe
    MASTER\\\\\\\\\\\\\\\\\\//////////////////////
    #include <16F877A.h>
    #use delay(clock=20000000)
    #include <K4X4.c>
    #include <LCD.c>
    #use rs232(baud=1200,xmit=PIN_C6,rcv=PIN_C7)
    void main(){
    lcd_init();
    kbd_init();
    unsigned int8 i,t,m,n,p,result;
    main:
    do {
    i=kbd_getc();
    } while(i=='\0'
    do {
    t=kbd_getc();
    }while(t=='\0'
    do {
    m=kbd_getc();
    } while(m=='\0'
    result=(((i*100)-4800)+((t*10)-480)+((m-48)
    putc(result);
    printf(lcd_putc,"\f%lu",result);
    goto main;
    }
    ////////////////////SLAVE\\\\\\\\\\\\\\\\\
    #include <16F877A.h>
    #use delay(clock=20000000)
    #include <LCD.c>
    #use rs232(baud=1200,xmit=PIN_C6,rcv=PIN_C7)
    void main(){
    lcd_init();
    unsigned int8 result;
    while(true){
    result=getc();
    printf(lcd_putc,"\f%lu",result);
    }
    }
    ////////////////////////////////////////////////////////////////////////
    اینم برنامه دوم که برای یه عدد 4 رقمی و با دستورات puts , gets نوشته شده
    #include <16F877A.h>
    #use delay(clock=20000000)
    #include <K4X4.c>
    #include <LCD.c>
    #include <stdlib.h>
    #use rs232(baud=1200,xmit=PIN_C6,rcv=PIN_C7)
    void main(){
    lcd_init();
    kbd_init();
    unsigned int32 i,t,m,n,p;
    char result[32];
    main:
    do {
    i=kbd_getc();
    } while(i=='\0'
    do {
    t=kbd_getc();
    }while(t=='\0'
    do {
    m=kbd_getc();
    } while(m=='\0'
    do {
    m=kbd_getc();
    } while(m=='\0'
    p=(((i*1000)-48000)+((t*100)-4800)+((m*10)-480)+(n-48));
    result = itoa(p, i32value, result);
    puts(result);
    printf(lcd_putc,"\f%c",result);
    goto main;
    }
    ////////////////////SLAVE\\\\\\\\\\\\\\\\\
    #include <16F877A.h>
    #use delay(clock=20000000)
    #include <LCD.c>
    #use rs232(baud=1200,xmit=PIN_C6,rcv=PIN_C7)
    void main(){
    lcd_init();
    char result[32];
    while(true){
    result=gets();
    printf(lcd_putc,"\f%c",result);
    }
    }


    #2
    پاسخ : مشکل با ارسال رشته در UART

    دوست عزیز منم یه بار میخواستم یه عدد 4 رقمی رو با استفاده از USART و ماژول HM-TR به یه نقطه دیگه بفرستم ولی موفق نشدم! اما بعدها تو یه سایتی ( نمیدونم EDABoard بود یا CCSINFO) خوندم که نوشته بود واسه این کار باید دوبار عمل ارسال را برای یک عدد 4 رقمی یا بهتر بگم 16 بیتی انجام بدیم! یه بار هشت بیت کم ارزش و بار دیگر پرارزش! خلاصه همه ی اینا بر میگرده به توانایی برنامه نویس که این ارسال و دریافت رو به درستی انجام بده.

    موفق باشید

    دیدگاه


      #3
      پاسخ : مشکل با ارسال رشته در UART

      برای این مشکل راه حل های زیادی هست.
      مثلا اینکه uart رو بصورت 9 بیتی پیکربندی کنید تا بتونید دیتای 16 بیتی رو بصورت یکجا ارسال کنید.(این تنظیمات توسط دستور ‎#use uart در دسترس میباشند)
      یه راه دیگه هم اینه که دیتا 16 بیتی رو به صورت دو دیتای 8 بیتی ارسال کنید و در گیرنده توسط دستور make16 دو دیتا 8 بیتی رو به یک دیتای 16 بیتی تبدیل کنید و ...

      دیدگاه


        #4
        پاسخ : مشکل با ارسال رشته در UART

        نوشته اصلی توسط محمد ایجی
        مثلا اینکه uart رو بصورت 9 بیتی پیکربندی کنید تا بتونید دیتای 16 بیتی رو بصورت یکجا ارسال کنید.(این تنظیمات توسط دستور ‎#use uart در دسترس میباشند)
        با سلام
        محمدخان یعنی با تغییر حالت 8 بیتی به 9 بیتی میشه دیتای 16 بیتی رو ارسال کرد؟ :eek: تا حالا خودتون این کار انجام دادین که مثلا عدد 1000 رو از طریق master به slave بفرستین!

        دیدگاه


          #5
          پاسخ : مشکل با ارسال رشته در UART

          یکی از پارامتر های دستور ‎#use rs232 اگه اشتباه نکنم use_16bit یا یه چیزی تو این مایه ها هستش که باعث میشه دستورات putc ‎ و getc اطلاعات رو بصورت 16 بیتی ارسال و دریافت کنن. که برای این منظور uart باید در مد 9 بیتی تنظیم بشه.

          دیدگاه


            #6
            پاسخ : مشکل با ارسال رشته در UART

            عزیزان توجه کنند که uart فقط 8 بیتو ارسال میکنه
            مشکلت اینجاست عزیز: m=kbd_getc . متغییر چهارمت هم m هستش عوضش کن. ok?

            دیدگاه


              #7
              پاسخ : مشکل با ارسال رشته در UART

              ببینید اول تو همون دستور #use rs232 این پارامتر رو بنویسید : bits=9
              بعد هم این یکی رو بنویسید : LONG_DATA
              حالا دیگه خیلی راحت میتونید توسط دستورات putc و getc دیتای 16 بیتی رو رد و بدل کنید .

              دیدگاه


                #8
                پاسخ : مشکل با ارسال رشته در UART

                نوشته اصلی توسط محمد ایجی
                ببینید اول تو همون دستور #use rs232 این پارامتر رو بنویسید : bits=9
                بعد هم این یکی رو بنویسید : LONG_DATA
                حالا دیگه خیلی راحت میتونید توسط دستورات putc و getc دیتای 16 بیتی رو رد و بدل کنید .
                :eek:

                دیدگاه


                  #9
                  پاسخ : مشکل با ارسال رشته در UART


                  3تا ایده برای حل این مشکل هست
                  1)استفاده از UART در مد 16 بیتی :در این حالت باید UART رو بصورت 9 بیتی پیکر بندی کرده و ... به این صورت
                  #use rs232 (1200,long_data,bits=9,xmit=rc6,rmit=rc7)
                  2)استفاده از دستور MAKE8 برای جداکردن 8 بیت بالا وپایین از هم وارسال آنها در مستر و دستور make16 در اسلیو برای بازیابی 16 بیت
                  3) استفاده از دستورات puts , gets که متغیری از نوع رشته رو می سازن
                  من این برنامه رو طبق ایده اول نوشتم اما هر چند عدد های بزرگتر از 255 رو نشون میده ولی اشتباه نشون میده. نظر دوستان چیه؟

                  ///////////////////////////////////////////////////
                  #include <16F877A.h>
                  #use delay(clock=20000000)
                  #include <K4X4.c>
                  #include <LCD.c>
                  #use rs232(baud=1200,BITS=9,LONG_DATA,xmit=PIN_C6,rcv=P IN_C7)
                  //to in barnameba keyboard 1 adad be micro ye aval midim va badaz
                  //ersal ba protocol UART roye microye dovom namayesh dade mishe
                  void main(){
                  lcd_init();
                  kbd_init();
                  unsigned int16 i,t,m,n,result;
                  main:
                  do {
                  i=kbd_getc();
                  } while(i=='\0'
                  do {
                  t=kbd_getc();
                  }while(t=='\0'
                  do {
                  m=kbd_getc();
                  } while(m=='\0'
                  do {
                  n=kbd_getc();
                  } while(n=='\0'
                  result=((i*1000)-48000)+((t*100)-4800)+((m*10)-480)+(n-48);
                  //if(result>255){
                  //lcd_putc("\fincorrect"
                  // goto main;
                  //}
                  //else
                  putc(result);
                  printf(lcd_putc,"\f%lu",result);
                  goto main;
                  }


                  پپپپپ\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\

                  #include <16F877A.h>
                  #use delay(clock=20000000)
                  #include <LCD.c>
                  #use rs232(baud=1200,BITS=9,LONG_DATA,xmit=PIN_C6,rcv=P IN_C7)
                  //to in barnameba keyboard 1 adad be micro ye aval midim va badaz
                  //ersal ba protocol UART roye microye dovom namayesh dade mishe
                  void main(){
                  lcd_init();
                  int16 p;
                  while(true){
                  p=getc();
                  printf(lcd_putc,"\f%lu",p);
                  }
                  }

                  دیدگاه

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