PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : [سوال] توضیح برنامه



vihan
28-08-2015, 13:32
سلام

من یک برنامه ی کوتاه وکاملاضروی دارم که نمی فهممش .متن برنامه ساده است:mrgreen: کسی می تونه توضیح بده؟؟؟؟؟:unh:




void getstr(char *str)
{
char ch = 0;
ch = getchar();
while((ch == 10) || (ch == 13) || (ch == 0))
ch = getchar();

while((ch != 10) && (ch != 13))
{
*str++ = ch;
ch = getchar();
}
*str = 0;
}

int getnstr(char *str , int n)
{
char ch = 0, counter = 0;
ch = getchar();
while((ch == 10) || (ch == 13) || (ch == 0)) {
ch = getchar();
if((counter++ == n))
return 0;
}

while((ch != 10) && (ch != 13))
{
*str++ = ch;
ch = getchar();
}
*str = 0;

return 1;
}

//++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++
// Power off the SIM900
//++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++
void SIM900_PWR_OFF(void)
{
char text1[100],text2[100];

printf("AT+CPOWD=1%c",Enter);
getstr(text1);
getstr(text1);
lcd_gotoxy(0,0);
lcd_puts(text1);
}int SIM900_Is_ON(void)
{
char text1[100],text2[100];
int a1=0,a2=0;

printf("AT%c",Enter);
a1 = getnstr(text1,10);
a2 = getnstr(text2,10);

if((a1 == 1) & (a2 == 1))
return 1;
else
return 0;}

mstkmn
29-08-2015, 10:36
سلام
فکر میکنم مشکلتون تو تابع getstr باشه.
این تابع اول یه سری کاراکتر رو از پورت سریال میگیره تا به یکی از کاراکتر های 10, 13 و یا 0 برسه و بعد از اون هر کاراکتری که دریافت کرد رو تو یه آرایه مینویسه و این کار رو ادامه میده
تا دوباره به کاراکتر 10 یا 13 برسه و ازتابع خارج میشه.

vihan
29-08-2015, 11:48
سلام
ممنون از لطفتون.ولی من منظور فراخوانی تابع getstr در power off sim 900 که بعد ازدستورprintfدوبار پشت سر هم فراخوانی شده رو نمی فهمم.؟؟؟ممنون به خاطر پاسختون:lol:

mstkmn
30-08-2015, 17:41
سلام این تابع برای خوندن پاسخ sim900 فراخونی شده و دوبار بودنش هم احتمالا به خاطر اینه که توی متن پاسخ چند تا کاراکتر 10 و 13 وجود داره.

vihan
30-08-2015, 18:05
سلام دوباره ممنون
ببخشید من منظورتونو نفهمیدم.میشه بیشتر توضیح بدید؟؟؟؟؟؟؟؟؟؟؟؟؟

mstkmn
30-08-2015, 18:26
بعد از اینکه شما یه کامندی رو برای ماژول ارسال میکنی (مثلا با تابع printf) ماژول در پاسخ یه رشته رو ارسال میکنه که معمولا توی این رشته چند تا کاراکتر 10 و 13 وجود داره. حالا توی برنامه بعد از ارسال کامند یعنی بعد از دستور printf شما باید رشته ارسالی ماژول رو با تابع getstr بخونی. منتها با توجه با پیاده سازی تابع getstr و به خاطر وجود کاراکترهای اضافی اگه فقط یه بار این تابع رو فراخونی کنی احتمالا متن اصلی رو از دست میدی.

vihan
30-08-2015, 19:06
خیلی ممنون از توضیح کاملتون.می دونم که امروز وقتتون گرفتم. اما یک سوال دیگه ام دارم؟؟؟
توی تابعی که الان براتون کپی می کنم در قستstrncpy منظوراز ptemp1+1یا ptemp1+4و... چیه؟؟؟
وچرا هربار درایه ی0 متغییرDT رو برابر صفر میزاره؟؟؟؟
وشرط تناقض در IFچد باید با شه که 1 رو برگردونه؟؟؟؟
باتشکر
// Get Time & Date
//++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++
int Get_CLK(int *year,int *month,int *day,int *hour,int *minute,int *second)
{
char text1[100],text2[100],DT[5];
char *ptemp1;


printf("AT+CCLK?%c",Enter);
getstr(text1);
getstr(text1);
getstr(text2);
//+CCLK: "12/07/24,21:56:19+00"
//Clear_String(DT,29);
ptemp1 = strchr(text1,'\"');
strncpy(DT,ptemp1+1,2);
DT[2] = 0;
*year = atoi(DT);
strncpy(DT,ptemp1+4,2);
DT[2] = 0;
*month = atoi(DT);
strncpy(DT,ptemp1+7,2);
DT[2] = 0;
*day = atoi(DT);
strncpy(DT,ptemp1+10,2);
DT[2] = 0;
*hour = atoi(DT);
strncpy(DT,ptemp1+13,2);
DT[2] = 0;
*minute = atoi(DT);
strncpy(DT,ptemp1+16,2);
DT[2] = 0;
*second = atoi(DT);

if(!strcmp(text2,"OK"))
return 1;
else
return 0;

}