سلام دوستان
ی مشکل خیلی عجیب پیش اومده اصلا متوجه نمیشم از دوستان میخوام راهنمایی کنن تشکر
ی تاپیک زدم بنده که راه اندازی 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 دریافت میشه و نمایش داده میشه من نمیفهمم وقتی هنوز مقایسه ای صورت نگرفته مقدارش چرا بهم ریخته اصلا !
ممنون میشم دوستان کمک کنن




دیدگاه