البته شما کد رو نگاه کنید متوجه میشیدchar data[4][7];
gets(data);
- - - Updated - - -
بافری تعریف نکردم ؟چطور باید تعریف کنم؟
- - - Updated - - -
بافری تعریف نکردم ؟چطور باید تعریف کنم؟
البته شما کد رو نگاه کنید متوجه میشیدchar data[4][7];
gets(data);
- - - Updated - - -
بافری تعریف نکردم ؟چطور باید تعریف کنم؟
- - - Updated - - -
بافری تعریف نکردم ؟چطور باید تعریف کنم؟
من که متوجه نشدم. شما اگه میشه عدد بگو.
من فقط میخوام بدونم که شما هر بار که وارد اینتراپت میشی چند بایت رو میخونی؟
من بافری تعریف نکردم برای دیتای دریافتی و اینکه در انتراپت همون ارایه دیتا رو از gets دریافت میکنم
data[4][7]
پس با این حساب فکر کنم هر بار یک بایت بیشتر نمیخونی.
چه باید کرد؟من با strcmp هم امتحان کردم جواب نداد
مشکل توی مقایسه نیست.
شما باید هر بایتی رو که دریافت میکنی سر جای خودش توی آرایه بنویسی و وقتی آرایه کامل شد اون رو مقایسه کنی.
البته من دقیقا نمی دونم gets چه جوری کار میکنه ولی احتمالا باید یه متغیر یه بایتی رو توش قرار بدی و اون رو توی جای مناست تو آرایه کپی کنی.
مثلا
gets(m);
data[1][2]=m;
که به جای 1 و 2 باید هر بار یه عدد قرار بدی.
gets رشته رو از سریال دریافت میکنه.چجوری میشه واسه ارایه من این کارو کردونمیفهمم چطور جمع و جور کنم
سلام
ببخشید که دیر جواب میدم
ببین توی مثلا AVR وقتی که بافر تعیین نمیکنی به طور پیش فرض طول بافر یک بایته و به ازای هر یک بایتی که دریافت میکنی یک بار تابع اینتراپت فراخوانی میشه.
حالا شما باید هر بار این بایت رو توی آرایه قرار بدی و شاید بهتر باشه از getchar() استفاده کنی.
مثلا توی تابع اینتراپت این کد رو بنویسی:
data[i][j]=getchar();
یا مثلا تو AVR بنویسی:
data[i][j]=UDR;
که i , j از 0 و 0 شروع میشه تا 7و 4 و وقتی آرایه کامل شد میتونی اون رو مقایسه کنی.
البته باید دقت داشته باشی که "B" دو بایته. حالا باید یا با کاراکتر های اضافی اون رو تکمیل کنی و یا یه جوری با تغییر درست i , j هر بایت رو سر جای خودش توی آرایه قرار بدی.
دوست عزیز به نتایج خوبی رسیدم الان همه چیز ok هست این کد:
اینم چیزی که تو سریال وارد میکنمunsigned char data[16];
unsigned char c[22]={"{etx}b{x80}{xc1}"};
#int_rda
void rda_isr(void)
{
data[0]=getchar(com1);
data[1]=getchar(com1);
data[2]=getchar(com1);
data[3]=getchar(com1);
data[4]=getchar(com1);
data[5]=getchar(com1);
data[6]=getchar(com1);
data[7]=getchar(com1);
data[8]=getchar(com1);
data[9]=getchar(com1);
data[10]=getchar(com1);
data[11]=getchar(com1);
data[12]=getchar(com1);
data[13]=getchar(com1);
data[14]=getchar(com1);
data[15]=getchar(com1);
//data[16]=getchar(com1);
//data[17]=getchar(com1);
for(i=0;i<16;i++)
if(c[i]!=data[i])
break;
if(i==16)
output_high(cmd4);
}//end of int
کد بالا درست کار میکنه اما مشکل ااینجاست که من میخوام ارایه ام این باشه:{etx}b{x80}{xc1}
الان مشکل سر ابک اسلش هست با این درست کار نمیکنهunsigned char c[22]={"{etx}b{\x80}{\xc1}"};
مشکل بک اسلش چیه؟
اگه منظورت توی ارسال هست باید به جای '\' ،'\\' رو بفرستی.
الان وقتی ارایه رو اینجوری تعریف میکنم کار نمیکنه{ETX}B{\X80}{\XC1}
این رو امتحان کن
کد:"{ETX}B{\\X80}{\\Xc1}"
مهندس من یه اشتباه میکردم ارایه باید این باشه
{0X03,0X42,0X80,0XC1}
خب الان مشکل چیه؟
الان این کد درست کار میکنه
اما وقتی تو سریال اینو وارد میکنم درست کار میکنهunsigned char data[16];
unsigned char c[16]={"0x030x420x800xc1"};
#int_RDA
void RDA_isr(void)
{
data[0]=getchar(com1);
data[1]=getchar(com1);
data[2]=getchar(com1);
data[3]=getchar(com1);
data[4]=getchar(com1);
data[5]=getchar(com1);
data[6]=getchar(com1);
data[7]=getchar(com1);
data[8]=getchar(com1);
data[9]=getchar(com1);
data[10]=getchar(com1);
data[11]=getchar(com1);
data[12]=getchar(com1);
data[13]=getchar(com1);
data[14]=getchar(com1);
data[15]=getchar(com1);
//data[16]=getchar(com1);
//data[17]=getchar(com1);
for(i=0;i<16;i++)
if(c[i]!=data[i])
break;
if(i==16)
output_high(CMD4);
}//END OF INT
در صورتی که وقتی از سریال وارد میکنم یکی نیستن0x030x420x800xc1
http://s4.picofile.com/file/8173064300/1.PNG
شما رشته رو 16 تایی تعریف کردی در حالی که 17 تاییه و توی تابع هم 18 تا getchar داری!!!
اولی اینا رو درست کن بعد ببین مشکل کجاست.
من با همینی که نوشتم جواب میگیرم اما زمانی که دیتارو دستس وارد میکنم وقتی از دیتای ترمینال وارد میکنم کار نمیکنه
اون مشکلاتی که گفتم که هست و باید اصلاح بشه.
شما چه طوری دیتا رو دستی وارد میکنی؟
فکر کنم مشکل اصلی حل شده و با یه کم تغییر توی دیتا و آزمون و خطا به جواب میرسی.
من دیتا رو copy میکردم که اشتباه بود باید از همین نرم افزار ترمینال وارد میکردم و اینکه کاری شما فرمودید انجام دادم تغییری نکرد
کدی رو که توی ترمینال وارد میکنی رو بذار تا ببینم.