قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

أدوات الموضوع

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:136
قديم 04-03-2015, 03:59 PM المشاركة 1   
x4 طريقه ممبسطه للقراءه البيانات من uart Twitter FaceBook Google+



السلام عليكم
في هذا الموضوع يشرح كيف نقرأ البيانات المرسله الى برتوكول uart اي RX, TX

للعلم كنا شرحنا في موضوع GSM طريقه قراءه حرف حرف طبعا هي بسيطه واليكم كود الي استخدمناها في القراءه البيانات
كود:
void interrupt(){
char tmp;
char i;
  if (RCIF_bit == 1) {                           // Do we have uart rx interrupt request?
    tmp = UART_Rd_Ptr();                         // Get received byte

// Process reception through state machine
// We are parsing only "OK" and "> " responses
    switch (gsm_state) {
      case  0: {
                response = -1;                   // Clear response
                if (tmp == 'O')                  // We have 'O', it could be "OK"
                  gsm_state = 1;                 // Expecting 'K'
                if (tmp == '>')                  // We have '>', it could be "> "
                  gsm_state = 10;                // Expecting ' '
                if (tmp == 'E')                  // We have 'E', it could be "> "
                  gsm_state = 30;                // Expecting 'R'
                if (tmp == 'S')                  // We have 'S', it could be "Status?" or "Set"
                  gsm_state = 40;                // Expecting 't'
                if (tmp == 'R')                  // We have 'R', it could be "RDx" or
                  gsm_state = 50;                // Expecting D
                if (tmp == 'C')                  // We have 'C', it could be "Clear"
                  gsm_state = 110;               // Expecting l
                if (tmp == 'U')                  // We have 'U', it could be "UNREAD"
                  gsm_state = 120;               // Expecting l
                break;
               }
      case  1: {
                if (tmp == 'K') {                // We have 'K' ->
                  response = GSM_OK;             // We have "OK" response
                  gsm_state = 20;                // Expecting CR+LF
                }
                else
                  gsm_state = 0;                 // Reset state machine
                break;
               }
      case 10: {
                if (tmp == ' ') {
                  response_rcvd = 1;             // We have "> " response
                  response = GSM_Ready_To_Receive_Message; // Set reception flag
                  responseID = response;         // Set response ID
                }
                gsm_state = 0;                   // Reset state machine
                break;
                }

      case 20: {
                if (tmp == 13)                   // We have 13, it could be CR+LF
                  gsm_state = 21;                // Expecting LF
                else
                  gsm_state = 0;                 // Reset state machine
                break;
               }
      case 21: {
                if (tmp == 10) {                 // We have LF, response is complete
                  response_rcvd = 1;             // Set reception flag
                  responseID = response;         // Set response ID
                }
                gsm_state = 0;                   // Reset state machine
                break;
               }

      case 30: {
                if (tmp == 'R')                  // We have 'R', it could be "ERROR"
                  gsm_state = 31;                // Expecting 'R'
                else
                  gsm_state = 0;                 // Reset state machine
                break;
               }
      case 31: {
                if (tmp == 'R')                  // We have 'R', it could be "ERROR"
                  gsm_state = 32;                // Expecting 'O'
                else
                  gsm_state = 0;                 // Reset state machine
                break;
               }
      case 32: {
                if (tmp == 'O')                  // We have 'O', it could be "ERROR"
                  gsm_state = 33;                // Expecting 'R'
                else
                  gsm_state = 0;                 // Reset state machine
                break;
               }
      case 33: {
                if (tmp == 'R'){                 // We have 'R'
                  response_rcvd = 1;             // We have "ERROR" response
                  response = GSM_ERROR;          // Set reception flag
                  responseID = response;         // Set response ID
                }
                gsm_state = 0;                   // Reset state machine
                break;
                }
      case 40: {
                if (tmp == 't')                  // We have 't', it could be "Status?"
                  gsm_state = 41;                // Expecting 'a'
                else
                  if (tmp == 'e')                // We have 'e'. it could be "Set"
                    gsm_state = 100;
                  else
                    gsm_state = 0;               // Reset state machine
               }; break;
      case 41: {
                if (tmp == 'a')                  // We have 'a', it could be "Status?"
                  gsm_state = 42;                // Expecting 't'
                else
                  gsm_state = 0;                 // Reset state machine
                break;
               }
      case 42: {
                if (tmp == 't')                  // We have 't', it could be "Status?"
                  gsm_state = 43;                // Expecting 'u'
                else
                  gsm_state = 0;                 // Reset state machine
                break;
               }

       case 43: {
                if (tmp == 'u')                  // We have 'u', it could be "Status?"
                  gsm_state = 44;                // Expecting 's'
                else
                  gsm_state = 0;                 // Reset state machine
                break;
               }

       case 44: {
                if (tmp == 's')                  // We have 's', it could be "Status?"
                  gsm_state = 45;                // Expecting '?'
                else
                  gsm_state = 0;                 // Reset state machine
                break;
               }

       case 45: {
                if (tmp == '?'){                 // We have '?'
                  status_req = 1;                // Status has been requested!
                }
                gsm_state = 0;                   // Reset state machine
                break;
                }

       case 50: {
                if (tmp == 'D')                  // We have 'D', it could be "RDx"
                  gsm_state = 51;                // Expecting number
                else
                  gsm_state = 0;                 // Reset state machine
                break;
               }
       case 51: {
                if (tmp >= '0' && tmp <= '7'){   // We have pin number, it could be "RDx"
                  if (set_stat)
                    Digital_O |= 1 << (tmp - '0');
                  if (clr_Stat)
                    Digital_O &= (0xFF ^(1 << (tmp - '0')));
                }
                  PORT_flag = 1;
                  gsm_state = 0;                 // Reset state machine
               }; break;

       case 100: {
                   if (tmp == 't'){              // We have 't', we received set command
                     set_stat = 1;               // Set following bits
                     clr_stat = 0;               // Do not clear following bits
                   }
                   gsm_state = 0;
                 }; break;
       case 110: {
                   if (tmp == 'l'){              // We have 'l', it could be Clear
                     gsm_state = 111;
                   }
                   else
                     gsm_state = 0;
                 }; break;
       case 111: {
                   if (tmp == 'e'){              // We have 'e', it could be Clear
                     gsm_state = 112;
                   }
                   else
                     gsm_state = 0;
                 }; break;
       case 112: {
                   if (tmp == 'a'){              // We have 'a', it could be Clear
                     gsm_state = 113;
                   }
                   else
                     gsm_state = 0;
                 }; break;
       case 113: {
                   if (tmp == 'r'){              // We have 'r', we have received Clear
                     clr_stat = 1;               // Clear following bits
                     set_stat = 0;               // Do not set following bits
                   }
                   gsm_state = 0;
                 }; break;
       case 120: {
                  if (tmp == 'N')
                    gsm_state = 121;
                  else
                    gsm_state = 0;
                 }; break;
       case 121: {
                  if (tmp == 'R')
                    gsm_state = 122;
                  else
                    gsm_state = 0;
                 }; break;
       case 122: {
                  if (tmp == 'E')
                    gsm_state = 123;
                  else
                    gsm_state = 0;
                 }; break;
       case 123: {
                  if (tmp == 'A')
                    gsm_state = 124;
                  else
                    gsm_state = 0;
                 }; break;
       case 124: {
                  if (tmp == 'D'){
                    response_rcvd = 1;             // We have "ERROR" response
                    response = GSM_UNREAD;         // Set reception flag
                    responseID = response;         // Set response ID
                    Unread_flag = 1;
                  }
                  gsm_state = 0;
                 }; break;
      default: {                                 // Unwanted character
                gsm_state = 0;                   // Reset state machine
               }
    }
==================================

هسى اريد تبسيط اكثر لعمليه القراءه للعلم طريقه وحيده ناجحه هي بأستخدام الانتربت

طبعا هذا موضوع مهم لانك سوف تستخدمه بعده تطبيقات منها GSM , XBEE و كومبيوتر وكثير من تطبيقات
في مشاركه القادمه سوضح لكم طريقه وأستخدام الامر memcmp

ماذا يعني memcmp
تعني مقارنه بين مصفوفتين فأذا كانت متطابقه ترجع 0 واذا لم تكن متطابقه ترجع الفرق بين الاول حرف مختلف

هذا شكل داله
كود:
int memcmp(void *s1, void *s2, int n);
Function compares the first n characters of objects pointed to by s1 and s2 and returns zero if the objects are equal, or returns a difference between the first differing characters (in a left-to-right evaluation). Accordingly, the result is greater than zero if the object pointed to by s1 is greater than the object pointed to by s2 and vice versa.

طبعا يتم مقارنه n من حروف s1 مع s2
يعني مثلا

كود:
char txt[] = "mikroElektronika";
char txt_sub[] = "mikro;

res = memcmp(txt, txt_sub, 16);  // returns 69, which is ASCII code of the first differing character - letter 'E'
تلاحظون بمثال تم مقارنه 16 حرف من txt مع txt_sub وبالطبع هنا غير متطابقه لذا رجعت لنا الفرق وهو حرف E

مثال اخر
كود:
memcmp(mess,"R1ON",4)
هنا تعني قارن اول 4 احرف من mess مع R1ON اذا كانت متطابقه ترجع 0 والا ترجع قيمه الفرق

مثال اخر
كود:
memcmp(mess+5,"R1OFF",5)
هنا تعني قارن 5 الاحرف من mess ابتداءا من عنصر 5 وقارنها مع R1OFF

===============================
x!

اذا كانت x=0 فالنتيجه x!=1
واذا كانت x لاتساوي 0 فالنتيجه دائما x!=0

اعلانات

abdewidad
:: مهندس متميز ::
تاريخ التسجيل: Dec 2013
الدولة: casablanca
المشاركات: 712
نشاط [ abdewidad ]
قوة السمعة:0
قديم 04-03-2015, 09:31 PM المشاركة 2   
افتراضي


بارك الله فيك اخي

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 0 اعجاب
شكراً حسن هادي محمود ( شكر العضو على هذه المشاركة )
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

abdewidad
:: مهندس متميز ::
تاريخ التسجيل: Dec 2013
الدولة: casablanca
المشاركات: 712
نشاط [ abdewidad ]
قوة السمعة:0
قديم 04-03-2015, 09:43 PM المشاركة 3   
افتراضي


ارجوا المساعدة اخي
http://www.qariya.info/vb/showthread.php?t=160910


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:136
قديم 05-03-2015, 02:28 AM المشاركة 4   
افتراضي


لاسف ماعندي معلومات حول هذا موديل

بس مفروض GSM تتعامل مع Rx, TX
http://www.mikroe.com/click/gsm/


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:136
قديم 05-03-2015, 02:30 AM المشاركة 5   
افتراضي


سوف نشرح طريقه في هذا الكود
كود:
char recive_flag , x;
char mess[7];

// Interrupt routine
void interrupt() {
  char temp=0;
  if(RCIF_bit==1)
    {
     RCIF_bit=0; //SR1ONFT,
     temp=UART1_Read();
     if(temp=='S'){ x=0; mess[0]=0;}
     else if(temp=='R'){  mess[x]=temp; x++;}
     else if(temp >='1' && temp  <='7'){  mess[x]=temp; x++;}
     else if(temp=='O'){  mess[x]=temp; x++;}
     else if(temp=='N'){  mess[x]=temp; x++;}
     else if(temp=='F'){  mess[x]=temp; x++;}
     else if(temp=='T'){ 
                        recive_flag=1;
                        if(x==4) mess[4]=0;
                        if(x==5) mess[5]=0;
                       }


    }
}

void main() {
  cmcon = 7;                     // Configure PORTC pins as digital
  TRISB.f0=0;
  TRISB.f3=0;
  RB0_bit=0;
  RB3_bit=0;
  UART1_Init(9600);               // Initialize UART module at 9600 bps
  Delay_ms(100);                  // Wait for UART module to stabilize

  UART1_Write_Text("Start");
  UART1_Write(13);
  UART1_Write(10);
  RCIE_bit = 1;                        // enable interrupt on UART1 receive
  TXIE_bit = 0;                        // disable interrupt on UART1 transmit
  PEIE_bit = 1;                        // enable peripheral interrupts
  GIE_bit = 1;                         // enable all interrupts


  while (1) {                     // Endless loop
             if(recive_flag==1)
                          {
                           recive_flag=0;
                           GIE_bit = 0;
                           UART1_Write_Text(mess);
                           if(!memcmp(mess,"R1ON",4))RB0_bit=1;
                           if(!memcmp(mess,"R1OFF",5))RB0_bit=0;
                           
                           if(!memcmp(mess,"R3ON",4))RB3_bit=1;
                           if(!memcmp(mess,"R3OFF",5))RB3_bit=0;
                           
                           for(x=0;x<6;x++)mess[x]=0;
                            GIE_bit = 1;
                          }

            }
}
شكل الرساله مرسله
SRxONT طول الرساله 4
SRxOFFT طول الرساله 5

X هي الارقام من 0 الى 9

اولا نخلي اشاره البدء ارسال البيانات واشاره انتهاء ارسال البيانات
حيث S هي البدء و T هي اشاره انتهاء
طبعا هذه الاحرف اختياريه لكن هي ضروريه لغرض استقبال البيانات
الان ماذا عندنا
عندنا هذه الاحرف
R
O
N
F
الارقام من 0 الى 9

باضافه الى شاره البدء والانتهاء
اذن لاحظو الكود في الانتربت
كود:
void interrupt() {
  char temp=0;
  if(RCIF_bit==1)
    {
     RCIF_bit=0; //SR1ONFT,
     temp=UART1_Read();
     if(temp=='S'){ x=0; mess[0]=0;}
     else if(temp=='R'){  mess[x]=temp; x++;}
     else if(temp >='1' && temp  <='7'){  mess[x]=temp; x++;}
     else if(temp=='O'){  mess[x]=temp; x++;}
     else if(temp=='N'){  mess[x]=temp; x++;}
     else if(temp=='F'){  mess[x]=temp; x++;}
     else if(temp=='T'){ 
                        recive_flag=1;
                        if(x==4) mess[4]=0;
                        if(x==5) mess[5]=0;
                       }


    }
}
تلاحظون لما نستقبل حرف S هنا نجعل اول عنصر بالمصفوفه =0 حتى نصفر مصفوفه وتبدأ بخزن البيانات
وعندما نستقبل حرف T هنا recive_flag=1 ونصفر عنصر الاخير من مصفوفه

==========================

كيف نقارن او نستفاد من البيانات انظرو الى هذا الكود
كود:
if(recive_flag==1)
                          {
                           recive_flag=0;
                           GIE_bit = 0;
                           UART1_Write_Text(mess);
                           if(!memcmp(mess,"R1ON",4))RB0_bit=1;
                           if(!memcmp(mess,"R1OFF",5))RB0_bit=0;
                           
                           if(!memcmp(mess,"R3ON",4))RB3_bit=1;
                           if(!memcmp(mess,"R3OFF",5))RB3_bit=0;
                           
                           for(x=0;x<6;x++)mess[x]=0;
                            GIE_bit = 1;
                          }
حيث تم شرح memcmp في مشاركه سابقه

لاحظو انه تم أختصار الكود الاستقبال البيانات بمقارنه مع مشاركه 1


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 05-03-2015 الساعة 10:01 AM
إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 02:04 AM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025