اطلاعیه

Collapse
No announcement yet.

پردازش داده های دریافتی از ماژول زیگبی ZE10

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

    پردازش داده های دریافتی از ماژول زیگبی ZE10

    سلام دوستان

    من یکسری داده از ماژول فرستنده گیرندم (ZE10) دریافت میکنم
    ماژول ها به پورت سریال میکرو LPC1768 متصل هستند
    و برای دریافت هم از کتابخانه uart که برای برد آموزشی خود سایت و برد Landingtiger هست استفاده میکنم
    داخل وقفه ی دریافت داده ها رو دریافت میکنم و داخل main برنامه هم ارسال رو انجام میدم
    خوب حالا مشکل اینجاست که:

    ماژول من وقتی ارسال انجام میده (اگر ارسالش موفق باشه و گیرنده دریافت بکنه) یه پیام OK برای من بر میگردونه که وقتی پیام OK رسید برنامه وارد وقفه دریافت میشه
    اگر پیام با موفقیت ارسال نشه یه پیام Error برای من برگردونده میشه که باز هم میکرو وارد وقفه دریافت میشه
    مورد دوم این هست که وقتی که با اون یکی ماژول ارسال انجام میشه و ماژولی که به میکرو متصل هست دریافت میکنه باز هم وارد وقفه دریافت میشه

    خوب من الان میخام بدونم که من باید چطوری تفاوت این Error و OK و داده ای که از ماژول دیگه ارسال میشه رو بفهمم؟

    خودم با تابع getchar داخل وقفه دریافت کاراکتر رو دریافت میکنم ولی نمیدونم که کاراکتری که دریافت کردم پیام OK هست یا پیام ERROR هست یا داده ی اصلی هست و وقتی هم که با sprintf روی LCD نمایشش میدم یکسری اعداد مختلف نشون داده میشه مثلا اول عدد 48 بعد عدد 57 بعد ..... ولی وقتی با همین تابع getchar توی حلقه for همه ی کاراکتر هارو میریزم توی یه رشته و رشته رو روی LCD نمایش میدم ،داده کاملا درست هست

    اصلا این تابع getchar مقدار اسکی برمیگردنه یا مقدار هگز یا ... و کلا چطوری من داده دریافتی رو ازش استفاده کنم و بتونم مثلا بفهمم که OK هست یا چیز دیگه ؟

    و یه سوال دیگه هم دارم ، داده ی اصلی که از ماژول های دیگه برای من میرسه به صورت +0000165000000156:555 میرسه به دست من که داده ی اصلی همون 555 هست که بعد از : اومده و اون بقیه کد هستند ، خوب حالا چطوری من داده ای که میخام (555) رو از اون کد اضافی جدا کنم ؟

    خیلی خیلی ممنون میشوم راهنمایی کنید
    تشکر فراوان
    http://vz.iminent.com/vz/39a77668-19...h-fishing.giff

    #2
    پاسخ : پردازش داده های دریافتی از Uart

    دوست عزیز، شما باید کل داده های دریافتی از پورت سریال رو داخل یک آرایه ذخیره کنی. هیچ بایتی نباید از قلم بیافته (خواه لازمش داشته باشی، خواه به دردنخور باشه). وقتی یک بستهذ داده کامل رو دریافت کردی، حالا باید بشینی و پردازشش کنی و پارامترهای مورد نیازت رو ازش در بیاری. وقفه پورت سریال می تونه به این سادگی باشه:
    کد:
    void rx_int(void)
    {
      buf[index] = ch;
      index++;
    }
    حالا توی برنامه اصلی (main) باید این index رو بررسی کنی و Buffer رو بخونی و قسمت های لازم رو جدا کنی.

    این "OK" و "Error" که می گید از چه جنسیه؟ یک کاراکتره؟ یا یک رشته ست؟ همین حرفها توشه؟ یا فقط یک بایته؟!
    بیایید با Google آشتی کنیم!

    دیدگاه


      #3
      پاسخ : پردازش داده های دریافتی از ماژول زیگبی ZE10

      سلام

      با تشکر فراوان
      ببخشید
      من بهتره یه توضیحی رو کار ماژول بدم

      خوب برای ارسال من باید یکسری کد رو به همراه داده اصلی ارسال کنم به اینصورت : AT+UNICAST=000195000000561E,2222 که داده اصلی الان همون 2222 هست و در پایان هم باید اینتر رو ارسال کنم به صورت UART2_SendByte(13); خوب حالا بدی این ماژول این هست که هرچی ارسال بشه ، توی خروجی هم میاد !!!
      یه حالت تایپ داره ، که مثلا شما توی HyperTerminal وقتی به ماژول کانکت باشی ، هر کاراکتری رو بزنی ماژول همون رو برمیگردونه که باید شما AT+UNICAST=000195000000561E,2222 رو تایپ کنی و بعد اینتر رو بزنی تا ارسال بشه و منتظر جواب OK یا ERROR که دوباره ماژول برمیگردونه باشی !!!
      خوب حالا این کار ها باید توی میکرو انجام بشه ، من وقتی توی برنامه اصلی به اینصورت ارسال میکنم UART2_SendString("AT+UNICAST=000195000000561E ,2222" سریعا وارد وقفه دریافت پورت سریال میشه و داده ای که به دست من رسیده همین AT+UNICAST=000195000000561E,2222 هست چون ماژول همون چیزی که ارسال کنین رو دوباره برمیگردونه !!! و بعد باید دوباره اینتر رو ارسال کنم UART2_SendByte(13); و بعد منتظر جواب ERROR یا OK باشم که دوباره وارد وقفه دریافت میشم !!!

      خوب این تازه برای ارسال بود ، برای دریافت وقتی داده ای از ماژول دیگه ای میرسه به صورت 000195000000510C:2222+ میرسه که باز هم وارد وقفه دریافت میشم و تازه باید داده اصلی که همون 2222 هست رو از اون کد ها جدا کنم !!!

      خوب حالا به نظر شما من چیکار کنم ؟؟؟ خودم با هر تابعی که تونستم امتحان کردم ولی نشد که نشد !!!
      http://vz.iminent.com/vz/39a77668-19...h-fishing.giff

      دیدگاه


        #4
        پاسخ : پردازش داده های دریافتی از ماژول زیگبی ZE10

        قبلاً با ماژولهای بلوتوث و GSM و GPS کار کردم. همه اینا یه دستور دارند برای اینکه Echo رو غیرفعال کنند. اینو اول کار ارسال می کنی و Echo غیرفعال میشه.
        اگر نشد، یه راه حل که برنامه نویسی رو ساده می کنه اینه که شما از 2 تا پورت سریال استفاده کنی. یکی فقط برای ارسال، یکی دیگه فقط برای دریافت. اون وقت فقط باید بعد از هر ارسال یه تأخیر درست کنی که بسته ارسالی رو ندید بگیری.
        بازم اگه نشد، در بدترین حالت شما می تونید با برنامه نویسی مناسب، کل کار رو انجام بدید. اصلاً سخت نیست. اینکه میکرو پس از اولین ارسال وارد وقفه دریافت میشه که چیزِ خطرناکی نیست! خوب وارد وقفه بشه. مگه وقفه دریافت چقدر قراره طول بکشه؟! فوقِ فوقش 1-2 میکروثانیه! اگه میکروتون ARM باشه که وقفه ش کمتر از همون یک میکروثانیه طول می کشه.

        برای پردازش داده های دریافت شده، من یه مثال عملی براتون دارم. با میکروی زاقارت! AVR دو تا ماژول به دو تا پورت سریال وصل کردم و بسته های هر دو رو پردازش می کنم. این شروع کار، تعریف متغیرهای عمومی و توابع وقفه:
        کد:
        unsigned char rx0_index=0, data0;
        unsigned char rx0_buff[256];
        
        unsigned char rx1_index=0, data1;
        unsigned char rx1_buff[32];
        
        interrupt [USART0_RXC] void usart0_rx_isr()
        {
          data0 = UDR0;
          rx0_buff[rx0_index++] = data0;
        }
        
        interrupt [USART1_RXC] void usart1_rx_isr()
        {
          data1 = UDR1;
          rx1_buff[rx1_index++] = data1;
        }
        خوب، می مونه پردازشِ این ها که توی تابع main و تو حلقه اصلی برنامه انجام شده. بعضی هاش رو اینجا می نویسم:
        کد:
        while (1)
           {
           .
           .
           .
           if(data0=='M')
             {
             
             delay_ms(2);    // Wait for 1 Line completion
        
             for(i=0;i<rx0_index;i++)
              {
              if(rx0_buff[i]=='$' && rx0_buff[i+1]=='G' && rx0_buff[i+2]=='P')
                {
                for (j=18;j<27;j++)
                  str1[j-18]=rx0_buff[i+j];
                ch1 = rx0_buff[i+j+1]; //'N'
                for (j=30;j<40;j++)
                  str2[j-30]=rx0_buff[i+j];
                ch2 = rx0_buff[i+j+1]; //'E'
                
                glcd_Putchar(6,18,ch1);        
                glcd_Printf(7,0,str1);
                delay_ms(1);
                glcd_Putchar(6,100,ch2);        
                glcd_Printf(7,68,str2);
                rx0_index=0;
                }
              }
              
             data0='0';    
             
             }
          .
          .
          .
        
           if(data1=='Y')
             {     
             
             delay_ms(20);    // Wait for 1 Line completion
        
             for(i=0;i<rx1_index;i++)
              {
              if(rx1_buff[i]=='X' && rx1_buff[i+8]=='Y')
                {
                for (j=0;j<6;j++)
                  str1[j]=rx1_buff[i+j];
                
                for (j=0;j<6;j++)
                  str2[j]=rx1_buff[i+j+8];        
                
                if(str1[1]=='-') sgn_x=-1;
                else if (str1[1]=='+') sgn_x=1;
                        
                if(str2[1]=='-') sgn_y=-1;
                else if (str2[1]=='+') sgn_y=1;
                
                
                x=sgn_x*((signed char) ((str1[2]-0x30)*10+str1[3]-0x30));
                y=sgn_y*((signed char) ((str2[2]-0x30)*10+str2[3]-0x30));        
                rx1_index=0;
                }
              }      
             data1='0';    
             
             }  
           .
           .
           .
        {
        بیایید با Google آشتی کنیم!

        دیدگاه


          #5
          پاسخ : پردازش داده های دریافتی از ماژول زیگبی ZE10

          سلام,
          برای مقایسه ی چیزی که از UART دریافت میکنید میتونید از تابع strcmp که در کتابخانه ی string.h هست استفاده کنید. به این صورت که یک char یا ارایه ای از char رو ازتون میگیره و مقداری که میخواید باهاش مقایسه کنید هم ازتون میگیره و اگر دو مقدار یکی نبودند 1 رو برمیگردونه.
          در این صورت مثلا اگر بخواید ببینید که مقدار دریافتی از UART برابر "OK" هست باید به صورت زیر عمل کنید.

          کد:
          #include <string.h>
          		char dat[10] = {'\0'};
          strcpy(dat, "OK");
          		if (!strcmp(dat, "OK"))
          		{
          			//Code...
          		}
          برای داده های دریافتی هم اگر داده ها بعد از کاراکتر ':' هستند میتونید از تابع strstr در کتابخانه قبلی استفاده کنید.

          کد:
          char s1 [] = "My House is small";
          printf ("Returned String 1: %s\n", strstr (s1, "House"));
          نتیجه:
          Returned String 1: House is small

          دیدگاه


            #6
            پاسخ : پردازش داده های دریافتی از ماژول زیگبی ZE10

            از این روش هم میتونی استفاده کنی که can تعداد بافر هست.با این روش میشه هر کارکتری را در بافر پیدا کرد.for دومی رو مقدارش رو برابر کلمه مورد نظر بزار خیلی راحت و سریع هرچی بخوای رو پیدا میکنی.
            کد:
            for(J=0;J<=Cnt;J++)
               { 
                    for(i=0;i<=1;i++)
                    M[i]=rx_buffer[i+J];
                    if(!strcmp(M,"OK"))
                    break;

            دیدگاه


              #7
              پاسخ : پردازش داده های دریافتی از ماژول زیگبی ZE10

              سلام

              خیلی تشکر از همه دوستان
              دوستان با دستور ATE0 که مربوط به AT Command هست ، Echo ماژول غیر فعال شد
              خوب الان داخل وقفه دریافت طبق گفته دوستان تونستم تفاوت داده اصلی با OK و ERROR رو بفهمم
              حالا داده ی اصلی رو دریافت کردم و میخام که اون قسمت اصلی رو ازش جدا کنم یعنی الان من 000195000000510C:2222+ رو دارم که میخام 2222 رو ازش جدا کنم و بتونم به صورت جدا گانه روش اعمال جبری و ... انجام بدم ، روشی که آقا کیهان اسدی گفتن رو اگر بیشتر روی نحوه استفادش توضیح بدید بهتر میشه و روش آقای arvin2009 یکم گنگ بود ولی تا جاییش که فهمیدم رو نوشتن ولی نشد !!!
              اگر دوستان کمک کنن ممنون میشوم

              تشکر
              http://vz.iminent.com/vz/39a77668-19...h-fishing.giff

              دیدگاه


                #8
                پاسخ : پردازش داده های دریافتی از ماژول زیگبی ZE10

                سلام

                منتظرم دوستان
                http://vz.iminent.com/vz/39a77668-19...h-fishing.giff

                دیدگاه

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