اطلاعیه

Collapse
No announcement yet.

خواندن اطلاعات از پورت سریال در C

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

    خواندن اطلاعات از پورت سریال در C

    سلام دوستان خسته نباشید .
    برنامه ارتباط با سریال به VB6 رو نوشتم . از سمت میکرو به وی بی اطلاعات درست میره . اما از سمت vb که میاد اطلاعات درست میاد اما نمیدونم چطور استفاده کنم یا شرط بزارم . وقتی از getchar استفاده میکنم .کاراکتر ها تک به تک نشون داده میشن مثلا اگر نوشته text1 رو از vb به میکرو بفرستم به این صورت میاد t بعد e بعد ... اما من میخوام کل text1 رو داشته باشم و بیام مقایسه کنم . از interupt برای میکرو استفاده میکنم . ظاهرا اطلاعات درست وارد rx_bufferمیشه اما نمیدونم چطور میشه واسه rx_buffer شرط گذاشت چون یک آرایه هست . ممنونم کمکم کنید .

    #2
    پاسخ : خواندن اطلاعات از پورت سریال در C

    طبق صحبت خودت اولین مسئله ای که هست اینه که آرایه داری. یعنی باید چند بار عمل خوندن انجام بشه. هر بار یک کاراکتر. از طرفی وقتی میگی متنی مثل "text1" دارم یعنی میدونی متنی به طول 5 کاراکتر داری. حالا در زمان ارسال باید این طول رو بفرستی تا در قسمت گیرنده بفهمه با متنی به چه طولی سرو کار داره. یا اینکه در انتهای متن یک کاراکتر مشخص برای مشخص کردن انتهای پیغام استفاده کنی. این کاراکتر در C کاراکتر '0\' هست که در VB میشه (0)$CHR .

    دیدگاه


      #3
      پاسخ : خواندن اطلاعات از پورت سریال در C

      ممنونم ؛ من تا قسمت دریافت مشکلی ندارم تمامی کاراکتر ها یک به یک دریافت میشن ؛ اما حالا چه طوری اونارو در کنار هم قرار بدم و دستور شرطی رو چه طور واسش بنویسم؟ مثلا اگر ورودی برابر text2 بود .

      دیدگاه


        #4
        پاسخ : خواندن اطلاعات از پورت سریال در C

        دوستان عزیز کسی نیست بگه چه طوری یک نوشته رو دریافت کنم ؟ مثل text1 و بعد چه طوری مقایسه کنم ؟
        یا اصلا یکی بیاد بگه نوشته ای که در string[] دخیره شده رو چه طوری مقایسه کنم ؟ چون وقتی با آ‌آ‌strcmp مقایسه میشه کاراکتر اول این رشته به یک کاراکتر دیگه تبدیل میشه که واقعا واسم عجیبه که فک کنم مشکل خود کدویژنه.

        دیدگاه


          #5
          پاسخ : خواندن اطلاعات از پورت سریال در C

          لطفا یکی کمک کنه . چه طوری یک string[] رو مقایسه کنم ؟

          دیدگاه


            #6
            پاسخ : خواندن اطلاعات از پورت سریال در C

            با سلام
            برای دریافت کارکتر می تونید به این شکل عمل کنید :
            از اونجا که تابعی مثل uart_getc() اگر کاراکتری وارد نشه عدد 255 رو برمیگردونه اول میایم چک میکنیم که آیا کاراکتری وارد شده یا خیر برای این کار از یک حلقه به صورت زیر استفاده میکنیم :

            کد PHP:
            do{
                    
            num uart_getc();
                          }while(
            num==256); 

            حالا برای دریافت کاراکتر مثلا مینویسیم :

            کد PHP:
             buffer[i]=num


            برای نمایش اونچه که توسط کیبورد وارد میشه روی pc ، مثلا مینویسیم :

            کد PHP:
            uart_putc(buffer[i]); 

            برای آماده شدن برای کاراکتر بعدی باید بریم به درایه بعد پس مینویسیم :

            کد PHP:
            i++; 

            حالا فرض کنیم که میخواهیم یک رشته رو که از قبل تعریف کردیم با رشته وارد شده مقایسه کنیم ، مثلا فکر کنید این رشته ذخیره شده ما باشه :

            کد PHP:
            char buffer[20],ma1[20]="lamp1-->on&quot

            حالا باید طول رشته رو محاسبه کنیم برای این منظور میایم نعداد کاراکتر های رشته مورد نظر رو تا جایی که برسیم به کاراکتر null میشماریم مثلا مینویسیم :

            کد PHP:
            while (ma1[l1]!='\0')l1++; 

            خوب حالا رسیدیم به جایی که رشته رو وارد کردیم حالا میخواهیم که عمل مقایسه انجام بشه از اونجا که معمولا اینتر به عنوان فرمان انتخاب میشه و معادل اسکی اون 13 هست مثلا میاییم اینجوری مینویسیم :

            کد PHP:
                    if (num==13)
                    {
                    
            j=0;    
            while (
            buffer[j]==ma2[j])j++;
            if (
            buffer[j+1]=='\0'&&j==l2)
            {PORTA&=~(1<<PA0);



            خوب این هم یه نمونه کد برای روشن و خاموش کردن مثلا دو تا لامپ که به pa0 , pa1 متصل شدند :

            کد:
            
            int main(void)
            {
            
              unsigned int i,j=0,l1,l2,l3,l4;
              char buffer[20],ma1[20]="lamp1-->on",ma2[20]="lamp1-->off",ma3[20]="lamp2-->on",ma4[20]="lamp2-->off";
              int num=134;
            
            while (ma1[l1]!='\0')l1++;
            while (ma2[l2]!='\0')l2++;
            while (ma3[l3]!='\0')l3++;
            while (ma4[l4]!='\0')l4++;
            DDRA=(1<<DDA0)|(1<<DDA1); 
            	
              /*
               * Initialize UART library, pass baudrate and AVR cpu clock
               * with the macro 
               * UART_BAUD_SELECT() (normal speed mode )
               * or 
               * UART_BAUD_SELECT_DOUBLE_SPEED() ( double speed mode)
               */
              uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); 
              
              /*
               * now enable interrupt, since UART library is interrupt controlled
               */
              sei();
                
              for(;;)
              {
                /*
                 * Get received character from ringbuffer
                 * uart_getc() returns in the lower byte the received character and 
                 * in the higher byte (bitmask) the last receive error
                 * UART_NO_DATA is returned when no data is available.
                 *
                 */
                do{
            		num = uart_getc();
            	  		}while(num==256);
            		 buffer[i]=num;
            		uart_putc(buffer[i]);
            		i++; 
            		if (num==13)
            		{
            		j=0;	
            while (buffer[j]==ma2[j])j++;
            if (buffer[j+1]=='\0'&&j==l2)
            {PORTA&=~(1<<PA0);
            }	
            
            j=0;
            while (buffer[j]==ma1[j])j++;
            if (buffer[j+1]=='\0'&&j==l1)
            {PORTA|=(1<<PA0);
            }			
            	
            j=0;	
            while (buffer[j]==ma4[j])j++;
            if (buffer[j+1]=='\0'&&j==l4)
            {PORTA&=~(1<<PA1);
            }	
            
            j=0;
            while (buffer[j]==ma3[j])j++;
            if (buffer[j+1]=='\0'&&j==l3)
            {PORTA|=(1<<PA1);
            }			
            for (int k = 0; k <20 ; k++)
            {
            	buffer[k]='\0';
            }
            
            i=0;
            		}

            دیدگاه

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