سلام دوستان
ی مشکل خیلی عجیب پیش اومده اصلا متوجه نمیشم از دوستان میخوام راهنمایی کنن تشکر
ی تاپیک زدم بنده که راه اندازی RF01Dبا اتمل استادیو رو به نتیجه رسوندم و حالا نیاز هست که کد دریافتی با ی کد مرجع مقایسه بشه تا در صورت صحت عملیاتی صورت بگیره
خب مشکل کجاس حالا ؟ این ک خیلی سادس ؟
برنامه بنده :
آرایه های زیر رو ببینید :
str بافر دریافت اطلاعات و دیگری هم کد کارت مورد نظر ما هست
باید باهم مقایسه بشن
راه هایی که جهت مقایسه این دو ارایه استفاده کردم :
1- در ابتدا با استفاده از دستور strcmp(key,str)==0 برای یکسان بودنشون اقدام کردم
2-
تابع strcmp رو خودم نوشتم
3-
استفاده از ی روش مقایسه ساده
و اما مشکل ؟
با هر روشی آرایه های بالا رو مقایسه میکنم مقدار دریافتی اصلیم از پورت سریال تغییر میکنه!!! هیچ ربطی نداره من حتی بعد از دریافت مقادیر و ریختنش در آرایه str یک کپی از این مقادیر رو در st2 ریختم و st2 و key رو باهم مقایسه کردم ! باز هم اطلاعات دریافتی که داخل str ریخته میشه عوض میشه !! و فقط هم کم ارزش ترین بایت عوض میشه
مثلا اگه شماره سریال کارت 12345 باشه مقدار دریافتی┼ 1234 اینجوری میشه
اصلا نمیفهمم به چی ربط داره مقایسه شدن دو تا آرایه به درهم ریختن ورودی سریال :| اصلا قبل مقایسه کردن این دوتا آرایه مقدار str دریافت میشه و نمایش داده میشه من نمیفهمم وقتی هنوز مقایسه ای صورت نگرفته مقدارش چرا بهم ریخته اصلا !
ممنون میشم دوستان کمک کنن
ی مشکل خیلی عجیب پیش اومده اصلا متوجه نمیشم از دوستان میخوام راهنمایی کنن تشکر
ی تاپیک زدم بنده که راه اندازی RF01Dبا اتمل استادیو رو به نتیجه رسوندم و حالا نیاز هست که کد دریافتی با ی کد مرجع مقایسه بشه تا در صورت صحت عملیاتی صورت بگیره
خب مشکل کجاس حالا ؟ این ک خیلی سادس ؟
برنامه بنده :
کد:
/* * RX.c * * Created: 11/01/2016 2:33:14 AM * Author : */ #include <avr/io.h> #include <util/delay.h> #ifndef F_CPU #define F_CPU 11059200UL #endif #include "lcd.h" #include <stdio.h> #define FOSC 11059200 #define BAUD 9600 #define MYUBRR FOSC/16/BAUD-1 unsigned char USART_Receive( void ) ; void USART_Init( unsigned int ); /* int strcmp(char *s1, char *s2) { int i; for (i = 0; s1[i] == s2[i]; i++) if (s1[i] == '\0') return 0; return s1[i] - s2[i]; } */ int main(void) { DDRB|= ((1<<1) | (1<<2)); LCDInit(LS_NONE); LCDClear(); LCDWriteStringXY(0,0,"RFID Reader"); _delay_ms(2000); USART_Init ( MYUBRR ); char str[11]={'0','0','0','0','0' ,'0','0','0','0','0'}; char key[11] ={'0','0','0','8','3', '2','3','1','4','8'}; int i = 1 ; while (1) { LCDClear(); LCDWriteStringXY(0,0,"Insert Card"); i = 1 ; UCSRB = (1<<RXEN) | UCSRB ; while(1) { str[i] = USART_Receive(); if (i >= 10) {i = 1 ; break ; } i++; } char st2[11]; for (int n = 0 ; n <10;n++) { st2[n] = str[n]; } LCDClear(); LCDWriteStringXY(0,0,"ID:"); LCDWriteStringXY(0,1,st2); UCSRB &=~(1<<RXEN) ; _delay_ms(2000); int z = 0 ; for ( int n = 0 ; n < 10 ; n++) { if (key[n] ==st2[n]) z++; } if (z>=9) { LCDClear(); LCDWriteStringXY(0,0,"Correct!"); _delay_ms(1500); } /* if (strcmp(str,key)==0) { PORTB |= 1<< 1 ; PORTB &=~(1<<2) ; LCDClear(); LCDWriteStringXY(0,0,"Correct!"); } else if (strcmp(str,key)!=0) { PORTB |= 1<<2 ; PORTB &=~(1<<1) ; LCDClear(); LCDWriteStringXY(0,0,"Invalid!"); } _delay_ms(1000); PORTB &=~((1<<1) | (1<<2)); */ for(int j = 0 ; j <=sizeof(str);j++) str[j] = '0' ; } } unsigned char USART_Receive( void ) { while ( !(UCSRA & (1<<RXC)) ) ; return UDR; } void USART_Init( unsigned int ubrr) { UBRRH = (unsigned char)(ubrr>>8); UBRRL = (unsigned char)ubrr; UCSRB = (1<<RXEN)|(1<<TXEN); UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0); }
آرایه های زیر رو ببینید :
کد:
char str[11]={'0','0','0','0','0' ,'0','0','0','0','0'}; char key[11] ={'0','0','0','8','3', '2','3','1','4','8'};
باید باهم مقایسه بشن
راه هایی که جهت مقایسه این دو ارایه استفاده کردم :
1- در ابتدا با استفاده از دستور strcmp(key,str)==0 برای یکسان بودنشون اقدام کردم
2-
تابع strcmp رو خودم نوشتم
کد:
int strcmp(char *s1, char *s2) { int i; for (i = 0; s1[i] == s2[i]; i++) if (s1[i] == '\0') return 0; return s1[i] - s2[i]; }
استفاده از ی روش مقایسه ساده
کد:
for ( int n = 0 ; n < 10 ; n++) { if (key[n] ==st2[n]) z++; } if (z>=10) { LCDClear(); LCDWriteStringXY(0,0,"Correct!"); _delay_ms(1500); }
با هر روشی آرایه های بالا رو مقایسه میکنم مقدار دریافتی اصلیم از پورت سریال تغییر میکنه!!! هیچ ربطی نداره من حتی بعد از دریافت مقادیر و ریختنش در آرایه str یک کپی از این مقادیر رو در st2 ریختم و st2 و key رو باهم مقایسه کردم ! باز هم اطلاعات دریافتی که داخل str ریخته میشه عوض میشه !! و فقط هم کم ارزش ترین بایت عوض میشه
مثلا اگه شماره سریال کارت 12345 باشه مقدار دریافتی┼ 1234 اینجوری میشه
اصلا نمیفهمم به چی ربط داره مقایسه شدن دو تا آرایه به درهم ریختن ورودی سریال :| اصلا قبل مقایسه کردن این دوتا آرایه مقدار str دریافت میشه و نمایش داده میشه من نمیفهمم وقتی هنوز مقایسه ای صورت نگرفته مقدارش چرا بهم ریخته اصلا !
ممنون میشم دوستان کمک کنن
دیدگاه