اطلاعیه

Collapse
No announcement yet.

دریافت دیتا به صورت آرایه ای از پورت سریال

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

    دریافت دیتا به صورت آرایه ای از پورت سریال

    با سلام خدمت دوستان عزیز در سایت مهندسی برق و الکترونیک همچنین تبریک به مناسبت فرا رسیدن بهار 89
    یه مشکل چیش اومده که با دوستان درمیون می ذارم
    یه برنامه داریم که دیتا رو به صورت زیر میفرسته
    AA AA BC 15 04 00 00 54 00 crc1 crc2 F0 f0 که این دیتا ها به صورت هگز ارسال میشه بعد من داخل میکرو به چه صورتی بنویسم که این دستور به همین شکلی که هست در آرایه ذخیره بشه تا من بتونم درمورد این دستور که چه کاری انجام میده تصمیم بگیرم لطفا دوستانی که میدونن یا در پروژه هایی این چنینی کار کردن کمک کنن
    در کوی نیک نامان مارا گذر ندادن گر تو نمی پسندی تغییر ده به از آن

    #2
    پاسخ : دریافت دیتا به صورت آرایه ای از پورت سریال

    از scanf و printf استفاده کن
    هرچه سعی کنیم لایه های نرم افزاری زیاد کرده و از سخت افزار دور کنیم مشکلات(باگ ها) کمتر خواهد شد(امنیت بیشتری خواهید داشت)
    بهترین جواب دهنده برای سوال شما، خود شما هستید البته بعد تلاش،پشتکار و مطالعه بیشتر
    میدونی مشکل ما کجاست؟سرمایه و مغز ها رو نمیتونیم یکجا جمع کنیم...

    تعدادی ماژول GPS GP5MX1513F1 با بالاتریت حساسیت -170db به قیمت خرید بفروش میرسد

    دیدگاه


      #3
      پاسخ : دریافت دیتا به صورت آرایه ای از پورت سریال

      دوست عزیزم من از بسکام استفاده کردم برای برنامه نویسی در ضمن اینتراپت هم استفاده کردم این دیتا رو دریافت می کنم ولی اگر این دستور2 بار پشت هم ارسال بشه دیگه نمی تونم دیتایی بگیرم و تصمیمی بگیرم تو کنترل دیتا مشکل بر می خورم
      در کوی نیک نامان مارا گذر ندادن گر تو نمی پسندی تغییر ده به از آن

      دیدگاه


        #4
        پاسخ : دریافت دیتا به صورت آرایه ای از پورت سریال

        بهتره که تمام حروف رو تبدیل به رشته کنی و اونا رو ارسال کنی
        اگه همینطوری می خوای ارسال کنی از ( در انتهای دستور استفاده کن

        حواست باشه تعداد بیت ها در ارسال باید با ه یکی با شه




        اگه مردم می دونستن زمان چقدر با ارزشه دیگه هیچ وقت کفش بند دار نمی خریدن البرت انیشتن

        دیدگاه


          #5
          پاسخ : دریافت دیتا به صورت آرایه ای از پورت سریال

          آقا سعید ممنون فهمیدم در ارسال مشکل ندارم ولی در دریافت مشکل پیدا می کنم :angry: :cry2:
          در کوی نیک نامان مارا گذر ندادن گر تو نمی پسندی تغییر ده به از آن

          دیدگاه


            #6
            پاسخ : دریافت دیتا به صورت آرایه ای از پورت سریال

            با اینتراپت رسیو رو روشن کنی
            من با سی کار می کنم
            اگر بهت می گفتم
            هرچه سعی کنیم لایه های نرم افزاری زیاد کرده و از سخت افزار دور کنیم مشکلات(باگ ها) کمتر خواهد شد(امنیت بیشتری خواهید داشت)
            بهترین جواب دهنده برای سوال شما، خود شما هستید البته بعد تلاش،پشتکار و مطالعه بیشتر
            میدونی مشکل ما کجاست؟سرمایه و مغز ها رو نمیتونیم یکجا جمع کنیم...

            تعدادی ماژول GPS GP5MX1513F1 با بالاتریت حساسیت -170db به قیمت خرید بفروش میرسد

            دیدگاه


              #7
              پاسخ : دریافت دیتا به صورت آرایه ای از پورت سریال

              n340 عزیز اگه براتون امکان داره این موضوع رو با سی بنویسید برام خودم به بسکام تبدیل می کنم با سی کامپیوتر آشنایی دارم ولی با سی اتمل آشنایی ندارم . دوستان دیگه هم اگه بلدن به زبون های دیگه این مشکل رو حل کنن برام خودم ترجمه می کنم :agree :read:
              در کوی نیک نامان مارا گذر ندادن گر تو نمی پسندی تغییر ده به از آن

              دیدگاه


                #8
                پاسخ : دریافت دیتا به صورت آرایه ای از پورت سریال

                نوشته اصلی توسط amirehsan
                n340 عزیز اگه براتون امکان داره این موضوع رو با سی بنویسید برام خودم به بسکام تبدیل می کنم با سی کامپیوتر آشنایی دارم ولی با سی اتمل آشنایی ندارم . دوستان دیگه هم اگه بلدن به زبون های دیگه این مشکل رو حل کنن برام خودم ترجمه می کنم :agree :read:
                توی همی قسمت یه سرچی بکن
                فک کنم یه برنامه با وقفه سریال نوشتم
                اتفاقا درست هم کار می کرد
                می تونی از اون استفاده کنی


                اگه مردم می دونستن زمان چقدر با ارزشه دیگه هیچ وقت کفش بند دار نمی خریدن البرت انیشتن

                دیدگاه


                  #9
                  پاسخ : دریافت دیتا به صورت آرایه ای از پورت سریال

                  بگردی کدشو پیدا می کنی پیدا نکردی بگو تا بزارم
                  هرچه سعی کنیم لایه های نرم افزاری زیاد کرده و از سخت افزار دور کنیم مشکلات(باگ ها) کمتر خواهد شد(امنیت بیشتری خواهید داشت)
                  بهترین جواب دهنده برای سوال شما، خود شما هستید البته بعد تلاش،پشتکار و مطالعه بیشتر
                  میدونی مشکل ما کجاست؟سرمایه و مغز ها رو نمیتونیم یکجا جمع کنیم...

                  تعدادی ماژول GPS GP5MX1513F1 با بالاتریت حساسیت -170db به قیمت خرید بفروش میرسد

                  دیدگاه


                    #10
                    پاسخ : دریافت دیتا به صورت آرایه ای از پورت سریال

                    دوستان عزیزم هرچی سرچ کردم پیدا نکردم سمپل برای این موضوع رو میشه برام یه نمونه بذارید که خودتون نوشتید و 100% کار میکنه :angry: :angry: :angry: :angry: :angry: :angry: :NO: :NO: :NO: :redface: :redface: :redface: :redface: :read: :read: :read: :read: :read: :read:
                    در کوی نیک نامان مارا گذر ندادن گر تو نمی پسندی تغییر ده به از آن

                    دیدگاه


                      #11
                      پاسخ : دریافت دیتا به صورت آرایه ای از پورت سریال

                      /************************************************** ***
                      This program was produced by the
                      CodeWizardAVR V2.03.4 Standard
                      Automatic Program Generator
                      © Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
                      http://www.hpinfotech.com

                      Project :
                      Version :
                      Date : 14-04-2009
                      Author :
                      Company :
                      Comments:


                      Chip type : ATmega16
                      Program type : Application
                      Clock frequency : 4,000000 MHz
                      Memory model : Small
                      External RAM size : 0
                      Data Stack size : 256
                      ************************************************** ***/

                      #include <mega16.h>

                      #define RXB8 1
                      #define TXB8 0
                      #define UPE 2
                      #define OVR 3
                      #define FE 4
                      #define UDRE 5
                      #define RXC 7

                      #define FRAMING_ERROR (1<<FE)
                      #define PARITY_ERROR (1<<UPE)
                      #define DATA_OVERRUN (1<<OVR)
                      #define DATA_REGISTER_EMPTY (1<<UDRE)
                      #define RX_COMPLETE (1<<RXC)
                      int n;
                      // USART Receiver buffer
                      #define RX_BUFFER_SIZE 8
                      char rx_buffer[RX_BUFFER_SIZE];

                      #if RX_BUFFER_SIZE<256
                      unsigned char rx_wr_index,rx_rd_index,rx_counter;
                      #else
                      unsigned int rx_wr_index,rx_rd_index,rx_counter;
                      #endif

                      // This flag is set on USART Receiver buffer overflow
                      bit rx_buffer_overflow;

                      // USART Receiver interrupt service routine
                      interrupt [USART_RXC] void usart_rx_isr(void)
                      {
                      char status,data;
                      status=UCSRA;
                      data=UDR;
                      if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
                      {
                      if (data != 0)
                      {
                      n = data;
                      }

                      else
                      {n=0;}
                      rx_buffer[rx_wr_index]=data;
                      if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
                      if (++rx_counter == RX_BUFFER_SIZE)
                      {
                      rx_counter=0;
                      rx_buffer_overflow=1;
                      };
                      };
                      }

                      #ifndef _DEBUG_TERMINAL_IO_
                      // Get a character from the USART Receiver buffer
                      #define _ALTERNATE_GETCHAR_
                      #pragma used+
                      char getchar(void)
                      {
                      char data;
                      while (rx_counter==0);
                      data=rx_buffer[rx_rd_index];
                      if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
                      #asm("cli&quot
                      --rx_counter;
                      #asm("sei&quot
                      return data;
                      }
                      #pragma used-
                      #endif

                      // Standard Input/Output functions
                      #include <stdio.h>

                      // Declare your global variables here

                      void main(void)
                      {
                      // Declare your local variables here

                      // Input/Output Ports initialization
                      // Port A initialization
                      // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
                      // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
                      PORTA=0x00;
                      DDRA=0x00;

                      // Port B initialization
                      // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
                      // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
                      PORTB=0x00;
                      DDRB=0xFF;

                      // Port C initialization
                      // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out
                      // State7=T State6=T State5=T State4=T State3=T State2=T State1=0 State0=0
                      PORTC=0x00;
                      DDRC=0x03;

                      // Port D initialization
                      // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=In Func0=In
                      // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=T State0=T
                      PORTD=0x00;
                      DDRD=0xFC;

                      // Timer/Counter 0 initialization
                      // Clock source: System Clock
                      // Clock value: Timer 0 Stopped
                      // Mode: Normal top=FFh
                      // OC0 output: Disconnected
                      TCCR0=0x00;
                      TCNT0=0x00;
                      OCR0=0x00;

                      // Timer/Counter 1 initialization
                      // Clock source: System Clock
                      // Clock value: Timer 1 Stopped
                      // Mode: Normal top=FFFFh
                      // OC1A output: Discon.
                      // OC1B output: Discon.
                      // Noise Canceler: Off
                      // Input Capture on Falling Edge
                      // Timer 1 Overflow Interrupt: Off
                      // Input Capture Interrupt: Off
                      // Compare A Match Interrupt: Off
                      // Compare B Match Interrupt: Off
                      TCCR1A=0x00;
                      TCCR1B=0x00;
                      TCNT1H=0x00;
                      TCNT1L=0x00;
                      ICR1H=0x00;
                      ICR1L=0x00;
                      OCR1AH=0x00;
                      OCR1AL=0x00;
                      OCR1BH=0x00;
                      OCR1BL=0x00;

                      // Timer/Counter 2 initialization
                      // Clock source: System Clock
                      // Clock value: Timer 2 Stopped
                      // Mode: Normal top=FFh
                      // OC2 output: Disconnected
                      ASSR=0x00;
                      TCCR2=0x00;
                      TCNT2=0x00;
                      OCR2=0x00;

                      // External Interrupt(s) initialization
                      // INT0: Off
                      // INT1: Off
                      // INT2: Off
                      MCUCR=0x00;
                      MCUCSR=0x00;

                      // Timer(s)/Counter(s) Interrupt(s) initialization
                      TIMSK=0x00;

                      // USART initialization
                      // Communication Parameters: 8 Data, 1 Stop, No Parity
                      // USART Receiver: On
                      // USART Transmitter: On
                      // USART Mode: Asynchronous
                      // USART Baud Rate: 9600
                      UCSRA=0x00;
                      UCSRB=0x98;
                      UCSRC=0x86;
                      UBRRH=0x00;
                      UBRRL=0x19;

                      // Analog Comparator initialization
                      // Analog Comparator: Off
                      // Analog Comparator Input Capture by Timer/Counter 1: Off
                      ACSR=0x80;
                      SFIOR=0x00;

                      // Global enable interrupts
                      #asm("sei&quot

                      while (1)
                      { putchar(PINA+PINC);
                      if (n != 0)
                      {
                      PORTB = n;
                      }


                      else
                      PORTB = 0;
                      };
                      }
                      هرچه سعی کنیم لایه های نرم افزاری زیاد کرده و از سخت افزار دور کنیم مشکلات(باگ ها) کمتر خواهد شد(امنیت بیشتری خواهید داشت)
                      بهترین جواب دهنده برای سوال شما، خود شما هستید البته بعد تلاش،پشتکار و مطالعه بیشتر
                      میدونی مشکل ما کجاست؟سرمایه و مغز ها رو نمیتونیم یکجا جمع کنیم...

                      تعدادی ماژول GPS GP5MX1513F1 با بالاتریت حساسیت -170db به قیمت خرید بفروش میرسد

                      دیدگاه


                        #12
                        پاسخ : دریافت دیتا به صورت آرایه ای از پورت سریال

                        داش دمت گرم که کاره مارو راه انداختی خیلی ممنون شرمنده کردی مارو :job: :job: :job: :wow: :wow: :applause: :applause: دوستان دیگه که با بسکام کار کردن اگه لطف کنن بسکامشو بذارن که برای سایر دوستان دیگه هم به درد بخوره
                        در کوی نیک نامان مارا گذر ندادن گر تو نمی پسندی تغییر ده به از آن

                        دیدگاه


                          #13
                          پاسخ : دریافت دیتا به صورت آرایه ای از پورت سریال

                          [right][right]سلام،

                          منم یه مدتی هست که دنبال همین قضیه ای هستم که امیراحسان اول گفت. ولی باور کنید الان متوجه نشدم چجوری مشکل ایشون حل شد. آخه شما تو حلقه ی while از putchar استفاده کردید. این چه ربطی به دریافت داره؟!!!

                          تو قسمت بالای کد اینتراپت Receive فعال شده، ولی نفهمیدم آخرش شما چجوری از این وقفه استفاده کردین!!!! الان یعنی اون آرایه ی هگز کجا ذخیره شد؟!!! می شه لطفا دقیقا بگید آرایه ای که دریافت کردید کجاست؟

                          منم می خوام یه آرایه ای یا رشته ای یا هرچیز دیگه که اسمشو می گذارید از هگز از یه ماژول تو میکرو دریافت کنم. از gets استفاده کردم ولی نشد. با scanf خواستم نوع داده دریافتی رو هگز تنظیم کنم و بگیرم که بازم نشد. این getchar هم که همه می گن تو وقفه دوباره تعریف می شه که فقط یه کاراکتر می گیره و اصلا کارمو راه نمیندازه.

                          درمورد تنظیماتشم بگم همه سرعت ها و baud rate و اینا درسته چون من با همین میکرو به همون ماژول آرایه هگز می فرستم و اونم دریافت می کنه و درست می گیره.(جالبه که بگم ارسال رو با
                          یه حلقه for و putchar(a[i])(
                          انجام میدم) که a آرایه ای از مقادیر هگز هست. پس تنظیمات درسته.

                          لطفا واضح تر توضیح بدید. خیلی خیلی ممنون

                          دیدگاه


                            #14
                            پاسخ : دریافت دیتا به صورت آرایه ای از پورت سریال

                            دوست عزیز من مشکلم این جور حل شد که این برنامه دوستان رو مطالعه کردم بعد یه لیبل در یه قسمت برنامه تعریف کردم که به محض اینکه اینتراپت پورت سریالم فعال شد به اون لیبل بره بعد دیتایی که اومده رو در یکی ایندکس های آرایه ذخیره کنه بعد از اینه ذخیره کرد به مقدار ایندکس آرایه یک واحد اضافه کنه تا برای دریافت بعدی آماده بشه بعد از اینکه کاراکتر های کنترلی آخر اومد ایندکس آرایه 1 بشه چون اگر ایندکس آرایه در میکرو کنترلر ها از 1 شروع میشه سوالی بود بازم در خدمتم
                            در کوی نیک نامان مارا گذر ندادن گر تو نمی پسندی تغییر ده به از آن

                            دیدگاه


                              #15
                              پاسخ : دریافت دیتا به صورت آرایه ای از پورت سریال

                              ممنون از اینکه کمک می کنی. من چند تا چیز واسم مبهمه

                              من تو یه خط از برنامه توی حلقه اصلی while(1) رشته هگز مورد نظر برناممو به ماژول می فرستم (چجوریشو قبلا گفتم) و اونم احتمال زیاد بلافاصله جواب میده. من واسه اینکه تو زمان دریافت جواب از ماژول مشکلی نداشته باشم می خوام از وققه استفاده کنم تا هر وقت از UART چیزی رسید اونو تو یه آرایه بریزه تا من اونو بررسی کنم.

                              سوال اول اینکه وقتی چیزی رسید، برنامه وقفه از کجا شروع می شه،یعنی از کدوم خط؟ فکر کنم از interrupt [USART_RXC] void usart_rx_isr(void) شروع می شه دیگه درسته؟!
                              خب اگه از اونجاست، مگه آرایه ی rx_buffer که اونجاست کل چیزی که دریافت می شه رو تو خودش ذخیره نمی کنه؟ (البته به اندازه سایز بافر) چرا نمی تونم مستقیم از rx_buffer استفاده کنم؟
                              راستی اون ماژول داده ی هگز می فرسته، می دونم روی خط همه چیز صفر و یکه، ولی rx_buffer اونو با چه فرمتی ذخیره می کنه؟

                              یه چیز دیگه هم هست. وقتی تو codevision وقفه فعال می شه، تابع getchar دوباره تعریف می شه. تا جایی که من از کد بازتعریف شدش فهمیدم, این تابع بعد از اینکه کار rx_buffer تموم شد و rx_counter صفر شد می شه ازش استفاده کرد. یعنی با هر بار فراخوانی یک عنصر از آرایه rx_buffer رو بر می گردونه و با فراخوانی بعدی، آرایه ی بعدی و الی آخر...

                              خب ازش استفاده کردم توی یه حلقه for تا محتویات rx_buffer رو باهاش توی یه آرایه دیگه بریزم و روش کار کنم ولی بازم نشد :angry:

                              از gets هم استفاده می کنم جواب نمی ده :angry: البته تو این حالت وقفه فعال نیست و منم وقفه رو می خوام ولی دارم میگم یعنی اینم جواب نداد :angry:

                              راستی اینم بگم رشته دریافتی من با 0xC0 شروع می شه و با همینم تموم می شه.

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

                              دیدگاه

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