اطلاعیه

Collapse
No announcement yet.

دریافت رشته از usart

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

    دریافت رشته از usart

    سلام
    sim900 رو راه اندازی کردم .
    برای rx یه اینتراپت درست کردم که کاراکترایی که sim 900 میده رو میگیره تو یه ارایه میریزه بعد روشون تحلیل انجام میده و مانیتور میکنه
    2 تا مشکل دارم
    1- اول با حلقه for اومدم بگیرم . میبینم اونجا باید عدد تعیین کنم که عدد مشخص نیست
    ممکنه ok بده یا error یا callerid یا sms باشه و تا وقتی عدد پر نشه جواب نمیده هر دفه کاراکتر میخواد :
    کد:
    char getchr(void)
    {    
       while(!((UCSRA&0x80)==0x80));
       return UDR;   
    }
    و از for خارج نمیشه و تو Int میمونه تا مثلا اگه for 50 باشه 50 تا کاراکتر رو بگیره
    2-حتی با این روشم یه برنامه C# نوشتم که متن رو کامل میفرسته . یعنی یه متنی رو تایپ میکنم بعد دکمه رو که میزنم همرو پست هم میفرسته به sim900 خوب مبفرستاد اون میگرفت اما به mega 8 که میدم کاراکترا رو دیتا لاست میده و ؟ میندازه
    چه جوری میتونم یه رسته رو بگیرم ؟ بدون اینکه تعداد کاراکتراش از قبل تعریف شده باشه (فقط ماکزیمم رو تعریف کنم) و سرعت بالا که لاست نده و اینکه میشه روشون timeout گذاشت که موازی با while باشه ؟ کاراکتر نیمذ بعد چند ثانیه خودش بیخیال شه
    اشکهايي که پس از هر شکست ميريزيم همان عرقيست که براي پيروزي نريخته ايم.
    هيتلر

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

    کسی نمیدونه ؟؟
    بد جور کارم گیره
    اشکهايي که پس از هر شکست ميريزيم همان عرقيست که براي پيروزي نريخته ايم.
    هيتلر

    دیدگاه


      #3
      پاسخ : دریافت رشته از usart

      SCANF :applause:
      اشکهايي که پس از هر شکست ميريزيم همان عرقيست که براي پيروزي نريخته ايم.
      هيتلر

      دیدگاه


        #4
        پاسخ : دریافت رشته از usart

        سلام
        منم دقیقا مشکل شما رو داشتم چون پروژه ای که با sim900 باید انجام می شد همواره دیتاها رو مورد انالیز قرار می داد.
        من باید می فهمیدم که چه وقت دیتا وامده و باید برم سروقت انالیزش.
        ببینید نحوه ارسال اطلاعات از sim900 به این صورته که یه کاراکتر 'r\' سپس 'n\' دیتا ارسال شده و دوباره 'r\' و 'n\'.
        در نتیجه وقتی echo رو غیرفعال کنید بعد از دریافت 2 کاراکتر اینتر یعنی متنی دریافت شده و سپس با حذف کاراکترهای اینتر و n\ می تونید به انالیز اون بپردازید.
        البته خب این یه راه حل بود که من استفاده کردم و تا حدودی جواب میده ولی راه های بهتری هم هست.
        باز اگه سوالی بود من در خدمتم.
        راستی حلقه for هم میشه استفاده کرد ولی این راحت تره و دستور scanf رو هم بیخیال بشید.
        چرا ناراحتی پاتریک!
        + امروز ی بچه دیدم سرچهارراه گل میفروخت
        - از دیدنش ناراحت شدی؟
        + نه
        پس چی ناراحتت کرده
        + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
        ------------------------------------------------------------------------------------------------------
        تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
        ------------------------------------------------------------------------------------------------------
        محصولات

        دیدگاه


          #5
          پاسخ : پاسخ : دریافت رشته از usart

          نوشته اصلی توسط سوران آراسته
          سلام
          منم دقیقا مشکل شما رو داشتم چون پروژه ای که با sim900 باید انجام می شد همواره دیتاها رو مورد انالیز قرار می داد.
          من باید می فهمیدم که چه وقت دیتا وامده و باید برم سروقت انالیزش.
          ببینید نحوه ارسال اطلاعات از sim900 به این صورته که یه کاراکتر 'r\' سپس 'n\' دیتا ارسال شده و دوباره 'r\' و 'n\'.
          در نتیجه وقتی echo رو غیرفعال کنید بعد از دریافت 2 کاراکتر اینتر یعنی متنی دریافت شده و سپس با حذف کاراکترهای اینتر و n\ می تونید به انالیز اون بپردازید.
          البته خب این یه راه حل بود که من استفاده کردم و تا حدودی جواب میده ولی راه های بهتری هم هست.
          باز اگه سوالی بود من در خدمتم.
          راستی حلقه for هم میشه استفاده کرد ولی این راحت تره و دستور scanf رو هم بیخیال بشید.
          ممنون اقا csanf رو که بیخیال شدم واقعا جواب نمیده
          اول یه سول . این که کاراکترهارو میفرسته بابت هر کاراکتر یه بار میره تو اینتراپت؟
          مثلا وقتی RING دریافت میشه همه تو یه اینتراپت میاد یا تو 4 تا اینتراپت جدا گانه ؟هر با یه کاراکتر میده ؟
          من دقیقا متوجه کاری که کردین نشدم . میشه یکم بیشتر توضیح بدبد :redface:
          اشکهايي که پس از هر شکست ميريزيم همان عرقيست که براي پيروزي نريخته ايم.
          هيتلر

          دیدگاه


            #6
            پاسخ : دریافت رشته از usart

            ببین دوست عزیز
            اول دریافت سریال رو با وقفه فعال می کنیم یعنی با ورود هر دیتا به رجیستر UDR، برنامه وارد روال وقفه میشه.
            اگه echo غیرفعال باشه به اون شکلی که گفتم دستورات وارد میکرو میشه و اگه یه شرط بزاری که اگر کاراکتر اینتر وارد بافر شد یه کانتر مقدار افزایش یک واحدی داشته باشه، بعد از 2 بار ورود اینتر یعنی از طرف ماژول اطلاعاتی دریافت شد و برین سروقت انالیزش.
            اگر از scanf استفاده کنید چون اخر رشته رو با اینتر تشخیص میشه همون بار اول از scanf می گذره در غیر اینصورت راحتترین کار استفاده از همون scanf شماست.
            امیدوارم منظورمو رسونده باشم.
            موفق باشید
            چرا ناراحتی پاتریک!
            + امروز ی بچه دیدم سرچهارراه گل میفروخت
            - از دیدنش ناراحت شدی؟
            + نه
            پس چی ناراحتت کرده
            + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
            ------------------------------------------------------------------------------------------------------
            تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
            ------------------------------------------------------------------------------------------------------
            محصولات

            دیدگاه


              #7
              پاسخ : دریافت رشته از usart

              مهندس من واقعا گیج شدم شرمنده !
              کد:
              interrupt [12] void sim_int_micro (void)
              {
                 unsigned char data;
                 data=getchr();
                if((data!=0X0D)||(data!=0X0A)||(data!=0X20))
                {
                  int_sim[i]=data;
                  i++;
                }
                delay_ms(3000);
                code_check();
              }
              //----------------------------------------
              void code_check(void)
                {
                putstring(int_sim);
                i=0;
                } 
              //while(1) khaliye hichi tosh nanevehstam
              با این کد کاراکترهارو میگیرم امایه مشکلی که داره همرو میگیره اما خیلیییی دیر پس میده . فرض کنید من در ارز .5 ثانیه 1 2 3 میدم اما در عرض 3 ثانیه به 3 ثانیه هر کدوم رو پس میده
              نمیتونم زمان بندیش رو درست کنم
              نمیتونم بهش بقهمونم که بعد اینتراپت کد هارو چک کنه خیر سرم اومدم تو اینتراپت delay گذاشتم که مثل تایم اوت عمل کنه ینی قبل چک 3 ثانیه وایشه اگه کاراکتر دیگه ای گرفت بریزه اگه 3 ثانیه نگرفت بره تو چک اما مثل اینکه وقتب تو اینتراپتم نمیشه دوباره انتراپت بخوره ! پی 3 ثانیه رو میشمره کد اول رو پس میده کد دوم میره تو ارایه 3 میشمره کد دوم رو پس میده !
              :angry:
              میتونم نمونه کد شما رو ببینم ؟
              اشکهايي که پس از هر شکست ميريزيم همان عرقيست که براي پيروزي نريخته ايم.
              هيتلر

              دیدگاه


                #8
                پاسخ : دریافت رشته از usart

                بله چرا که نه.
                در نمونه کدی که قرار میدم به راحتی OK دریافت میشه و مثلا با اومدن پیام جدید یا هر دیتایی از ماژول، پس از دریافت بر روی نمایشگر نمایش داده خواهد شد.
                نمونه کد صرفا جهت اشنایی قرار داده شده و لزوما کد کاملی نیست.
                فایل های پیوست شده
                چرا ناراحتی پاتریک!
                + امروز ی بچه دیدم سرچهارراه گل میفروخت
                - از دیدنش ناراحت شدی؟
                + نه
                پس چی ناراحتت کرده
                + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
                ------------------------------------------------------------------------------------------------------
                تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
                ------------------------------------------------------------------------------------------------------
                محصولات

                دیدگاه


                  #9
                  پاسخ : دریافت رشته از usart

                  اقا من کامنت قبلیم رو کاملا ادیت کردم یه رفرش بکنید بی زحمت :redface: :redface: :redface: :redface: :redface: :redface: :redface: :redface:
                  کدی که نوشتم قابل اصلاح هست ؟
                  اشکهايي که پس از هر شکست ميريزيم همان عرقيست که براي پيروزي نريخته ايم.
                  هيتلر

                  دیدگاه


                    #10
                    پاسخ : دریافت رشته از usart

                    اره میشه اصلاحش کرد ولی خب کلا منطقی نیست :(
                    یادتون باشه که روال وقفه به هیچ وجه نباید زیاد شلوغ باشه و اون تاخیر عملا صحیح نیست.
                    پیشنهاد میکنم یکبار به صورت کامل با ماژول از طریق کامپیوتر ارتباط برقرار کنید و با ارسال ATcommanهای مختلف و دریافت نتیجه، از نحوه عملکرد ماژول و انتقال اطلاعات سریال اون مفاهیم مورد نیاز رو متوجه بشین بنده هم با کمال میل خوشحال میشم کمکتون کنم.
                    موفق باشید
                    چرا ناراحتی پاتریک!
                    + امروز ی بچه دیدم سرچهارراه گل میفروخت
                    - از دیدنش ناراحت شدی؟
                    + نه
                    پس چی ناراحتت کرده
                    + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
                    ------------------------------------------------------------------------------------------------------
                    تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
                    ------------------------------------------------------------------------------------------------------
                    محصولات

                    دیدگاه


                      #11
                      پاسخ : پاسخ : دریافت رشته از usart

                      نوشته اصلی توسط سوران آراسته
                      اره میشه اصلاحش کرد ولی خب کلا منطقی نیست :(
                      یادتون باشه که روال وقفه به هیچ وجه نباید زیاد شلوغ باشه و اون تاخیر عملا صحیح نیست.
                      پیشنهاد میکنم یکبار به صورت کامل با ماژول از طریق کامپیوتر ارتباط برقرار کنید و با ارسال ATcommanهای مختلف و دریافت نتیجه، از نحوه عملکرد ماژول و انتقال اطلاعات سریال اون مفاهیم مورد نیاز رو متوجه بشین بنده هم با کمال میل خوشحال میشم کمکتون کنم.
                      موفق باشید
                      مهندس یه دنیا ازت ممنونم :applause:
                      قبلا رو pc تست کردم
                      کدت واقعا کمک کرد این کد نهایی:
                      کد:
                      interrupt [12] void sim_int_micro (void)
                      {
                        unsigned char data;
                        data=getchr();
                        if(data!=32)
                        {
                          code_check(data);
                        }
                      }
                      //--------------------------
                      void code_check(unsigned char data)
                        {
                        int e;
                        if(data!=13)
                          {
                            int_sim[i]=data; 
                            i++;
                          }
                        else if(data==13)
                          {
                            inter++;
                            if(inter==3)
                            {
                            putstring(int_sim);
                            i=0;
                            inter=0;
                            for(e=0;e<=99;e++)
                            int_sim[e]='\0';
                            }
                          }
                        }
                      رو پروتئوس جواب داد بین میکرو و pc آمتحان میکنم اگه اونم بده میبندمش رو sim900
                      یه دنیا ممنونم
                      اشکهايي که پس از هر شکست ميريزيم همان عرقيست که براي پيروزي نريخته ايم.
                      هيتلر

                      دیدگاه


                        #12
                        پاسخ : دریافت رشته از usart

                        مهندس یه سوال دیگه
                        من برنامه نویسی رو انجام دادم واسه تحلیل داده ها یه تابع نوشتم :
                        کد:
                                //putstring(data);
                                //if((data[0]=='O')&&(data[1]=='K'))
                                //putchr('O');
                                //ret=__SIM_OK;
                                //else if((int_sim[0]=='E')&&(int_sim[1]=='R'))
                                //ret=__SIM_ERROR;
                                
                                
                                //else if((int_sim[0]=='N')&&(int_sim[1]=='O'))
                                //ret=__SIM_NOCAR;
                                //else if((int_sim[0]=='+')&&(int_sim[1]=='C'))
                                //ret=__SIM_RING;
                                //else
                                //ret=__SIM_NULL;
                        اولین بار که اطلاعات میاد درسته اما از دفعات بعد دیگه درست کار نمیکنه . وصل کردم به کامپیوتر دیدم مثلا خوته 0 ارایه باید O باشه 1کش K باشه خونه های اولیه با کاراکترایی مثل ؟ یا یه مستطیل پر شده کد هگز 0A نمیدونم از کجا اومده فیلترشم میکنم چیزی گیرم نمیاد یه راه دیگه واسه حل کردن مشکل پیدا کردم فعلا کارم رو راه میندازه اما چجوری میتونم از دست این کاراکترا خلاص شم . جواب نداد دیگه این کارو کردم :
                        کد:
                        for(i=0;data[i];i++)
                                {
                                if(data[i]=='O')
                                  if(data[i+1]=='K')
                                    putchr('D'); 
                                }
                                for(i=0;data[i];i++)
                                {
                                if(data[i]=='E')
                                  if(data[i+1]=='R')
                                    putchr('E'); 
                                }
                        به جای اینکه بیاد فقط خونه 0 و 1 رو واسه OK بگرده همرو میگرده !. این کاراکترای نویز مانند نمیزارن کار درست انجام بشه . چجوری میتونم حذفشون کنم که کد اول جواب بده ؟
                        اشکهايي که پس از هر شکست ميريزيم همان عرقيست که براي پيروزي نريخته ايم.
                        هيتلر

                        دیدگاه


                          #13
                          پاسخ : دریافت رشته از usart

                          سلام دوستان
                          منم یه مشکل توی دریافت رشته در USART دارم
                          پروژه من ساده اس و قرار که من از طریق لب تاب یه ال ای دی متصل به میکرو رو روشن و خاموش کنم به این صورت که وقتی توی لب تاپ تایپ کردم on ال ای دی روشن و برعکسش خاموش بشه
                          من مشکلم اینکه اگر از دستور getchar استفاده کنم باید دونه دونه حروف رو بگیرم و کار مشکلیه و بلدم نیستم که چجوری باید رشته کلی ای که دریافت کردم( در اینجا on مثلا) رو چک کنم یعنی اینکه چجوری بفهمم on گرفتم یا off چون هدستور if که نشد
                          و اگه از دستور gets استفاده کنم باید تعداد بیت رو مشخص کنم که خوب معلوم نیس 3 تا هس یا 2 تا ، و اگر 3 تا بزارم خب طرف باید یه on تایپ کنه با یه فاصله که دستگاه ازش قبول کنه یعنی اگه شما on رو تایپ کنی بعد اینتر بزنی هنوز سر دستور get هستی چون نوشتی 3 بیت قراره دریافت کنی
                          اگه ممکنه راهنمایی کنید که اینجا م ن چجوری می تونم on و off رو دریافت کنم به صورت کامل
                          راستی یه مشکل دیگه اینکه اگه از get استفاده کنم موقع تایپ نمی نویسه چی دارم تایپ می کنم

                          دیدگاه


                            #14
                            پاسخ : دریافت رشته از usart

                            نوشته اصلی توسط ERMIA.E نمایش پست ها
                            سلام دوستان
                            منم یه مشکل توی دریافت رشته در USART دارم
                            پروژه من ساده اس و قرار که من از طریق لب تاب یه ال ای دی متصل به میکرو رو روشن و خاموش کنم به این صورت که وقتی توی لب تاپ تایپ کردم on ال ای دی روشن و برعکسش خاموش بشه
                            من مشکلم اینکه اگر از دستور getchar استفاده کنم باید دونه دونه حروف رو بگیرم و کار مشکلیه و بلدم نیستم که چجوری باید رشته کلی ای که دریافت کردم( در اینجا on مثلا) رو چک کنم یعنی اینکه چجوری بفهمم on گرفتم یا off چون هدستور if که نشد
                            و اگه از دستور gets استفاده کنم باید تعداد بیت رو مشخص کنم که خوب معلوم نیس 3 تا هس یا 2 تا ، و اگر 3 تا بزارم خب طرف باید یه on تایپ کنه با یه فاصله که دستگاه ازش قبول کنه یعنی اگه شما on رو تایپ کنی بعد اینتر بزنی هنوز سر دستور get هستی چون نوشتی 3 بیت قراره دریافت کنی
                            اگه ممکنه راهنمایی کنید که اینجا م ن چجوری می تونم on و off رو دریافت کنم به صورت کامل
                            راستی یه مشکل دیگه اینکه اگه از get استفاده کنم موقع تایپ نمی نویسه چی دارم تایپ می کنم
                            سلام
                            از وقفه دریافت سریال استفاده کنید. فقط باید 3 مرحله مختلف در کدتون ایجاد کنید که مدیریت این 3 مرحله رو میشه خیلی ساده با یک متغیر گلوبال انجام داد.
                            .خوب توی مرحله اول، کاراکتر اول رو که میگیرید و چک میکنید o هست یا نه. اگر o بود میرید مرحله بعد وگرنه که همینطور منتظر o میمونید.
                            اگر توی مرحله دوم n دریافت کردید، که خوب دستور روشن شدن رو شناسایی کردید و باز بر میگردید مرحله اول برای دریافت دستورات بعدی. نه اگر f دریافت کردید، میرید به مرحله بعد. اگر نه f دریافت شد و نه n، معلوم میشه چیزی که دریافت کردید دستور قابل قبولی نیست و باز بر میگردید مرحله 1.
                            توی مرحله 3 اگر f دریافت شد که خوب دستور خاموش شدن رو شناسایی کردید. اگر چیزی غیر از f بود معلوم میشه دستور قابل قبول نیست و باز برمیگردید مرحله 1.

                            دیدگاه


                              #15
                              پاسخ : دریافت رشته از usart

                              نوشته اصلی توسط hossein.m98 نمایش پست ها
                              سلام
                              از وقفه دریافت سریال استفاده کنید. فقط باید 3 مرحله مختلف در کدتون ایجاد کنید که مدیریت این 3 مرحله رو میشه خیلی ساده با یک متغیر گلوبال انجام داد.
                              .خوب توی مرحله اول، کاراکتر اول رو که میگیرید و چک میکنید o هست یا نه. اگر o بود میرید مرحله بعد وگرنه که همینطور منتظر o میمونید.
                              اگر توی مرحله دوم n دریافت کردید، که خوب دستور روشن شدن رو شناسایی کردید و باز بر میگردید مرحله اول برای دریافت دستورات بعدی. نه اگر f دریافت کردید، میرید به مرحله بعد. اگر نه f دریافت شد و نه n، معلوم میشه چیزی که دریافت کردید دستور قابل قبولی نیست و باز بر میگردید مرحله 1.
                              توی مرحله 3 اگر f دریافت شد که خوب دستور خاموش شدن رو شناسایی کردید. اگر چیزی غیر از f بود معلوم میشه دستور قابل قبول نیست و باز برمیگردید مرحله 1.

                              متوجه شدم خیلی ممنون
                              فقط یه سوال خب این یه کد اسون بود اگه یه کد طولانی باشه من باید هر سری این کار رو بکنم چون در اون صورت کدم خیلی طولانی و سخت میشه
                              راه اسون تری نداره؟

                              دیدگاه

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