السلام عليكم
بعد جهد جهيد وعدة محاولات تم حل المشكلة بعون الله
وكان الحل بحذف الامرين
كود:
UART1_Write(13);
UART1_Write(10);
من المرسل.
والامر
من المستقبل.
وصار البرنامج هكذا:
المرسل:
كود:
unsigned x=0;
unsigned y;
unsigned k;
int n;
void main()
{ TRISD=0xff;
UART1_Init(9600);delay_ms(100);
while(1)
{
if(PORTD.F1==0)
{ while(PORTD.F1==0){}
x=x+9;
}
if(PORTD.F0==0)
{ while(PORTD.F0==0){}
k=x;
for(n=4;n>=0;n--)
{ y=k/pow(10,n);
UART1_Write(48+y);
k=k-(y*pow(10,n));
if(n==0)break;
}
}
}
}
والمستقبل:
كود:
void main() {
unsigned x=0;
unsigned w=0;
int y;
int n=5;
char k;
TRISC.f0=1;
UART1_Init(9600);delay_ms(100);
while(1)
{
if(UART1_Data_Ready()==1)
{ if(n==5){x=0;}
n--;
k=UART1_Read();
UART1_Write(k);
x=x+((k-48)*pow(10,n));
if(n==0)n=5;
}
if(PORTC.f0==0)
{ while(PORTC.f0==0){}
w=x;
UART1_Write(13);
UART1_Write(10);
for(n=4;n>=0;n--)
{ y=w/pow(10,n);
UART1_Write(48+y);
w=w-(y*pow(10,n));
if(n==0){n=5; break;}
}
}
}
}
ولقد اضفت مفتاح في المستقبل يعرض قيمة X التي هي القيمة الفعلية التي ارسلت (الرقم كامل اي بعد تجميع الارقام التي ارسلت...احاد ..وعشرات..ومئات........) لكي اتأكد ان عملية التجميع كانت صحيحة ام لا ، حيث انني استخدمت الامر
كود:
x=x+((k-48)*pow(10,n));
للتجميع.
ولكن فوجئت ان الناتج كان صحيحا فقط اذا كان العدد المرسل مكون من خانة الاحاد فقط(مثلا 00002 او 00007 او.....) وكان ناقصا بواحد اذا ارسل رقم به عدد واحد في خانة العشرات او المئات او...(اي اذا ارسل 00014 كان الناتج 00013 واذا ارسل 00208 كان الناتج 00207)، وكان ناقصا باثنين اذا ارسل رقم به عددان واحد في العشرات وواحد في المئات(اي اذا ارسل 00114 كان الناتج 00112 واذا ارسل 00288 كان الناتج 00286)
لم استطع ان اجد تفسير لهذه الحاله الغريبة رغم انني اعتقد ان الامر
كود:
x=x+((k-48)*pow(10,n));
صحيح 100%
لذلك قمت بتعديل كود المستقبل باستخدام الاوامر
كود:
if(n==4){x=x+((k-48)*10000);}
if(n==3){x=x+((k-48)*1000);}
if(n==2){x=x+((k-48)*100);}
if(n==1){x=x+((k-48)*10);}
if(n==0)x=x+((k-48)*1);
بدلا من الامر السابق
وصار كود المستقبل هكذا:
كود:
void main() {
unsigned x=0;
unsigned w=0;
int y;
int n=5;
char k;
TRISC.f0=1;
UART1_Init(9600);delay_ms(100);
while(1)
{
if(UART1_Data_Ready()==1)
{ if(n==5){x=0;}
n--;
k=UART1_Read();
UART1_Write(k);
if(n==4){x=x+((k-48)*10000);}
if(n==3){x=x+((k-48)*1000);}
if(n==2){x=x+((k-48)*100);}
if(n==1){x=x+((k-48)*10);}
if(n==0){x=x+((k-48)*1); n=5;}
}
if(PORTC.f0==0)
{ while(PORTC.f0==0){}
w=x;
UART1_Write(13);
UART1_Write(10);
for(n=4;n>=0;n--)
{ y=w/pow(10,n);
UART1_Write(48+y);
w=w-(y*pow(10,n));
if(n==0){n=5; break;}
}
}
}
}
وقد عمل البرنامج بشكل صحيح وبدون مشاكل.
اذا كان هناك احد يفسر لنا ما صار لي او يرى ان هناك مشكلة قد عملتها وان لا ادري ان يوضحها لنا لتعم الفائدة
او ان احد لديه طريقة اخرى لارسال رقم من بيك الى اخر كما بهذا البرنامج ان يتكرم بوضعها لكي يستفيد الكل وكل من يتطلع الى تعلم البرمجة وزيادة مهارته فيها.
ودمتم في رعاية الله وحفظه.
اخوكم المفلحي.