مشکلی که برخوردم اینه که
x از سمت میکرو ارسال میشه
برنامه هم نشون میده ولی تشخیص نمیده
که x اومده و به سراغ بایت بعدی بره
Printable View
مشکلی که برخوردم اینه که
x از سمت میکرو ارسال میشه
برنامه هم نشون میده ولی تشخیص نمیده
که x اومده و به سراغ بایت بعدی بره
مشکل بالا با تغییرات زیر حل شد ،تا مشکل بعدی :20:
[PHP]public void mfg()
{
Thread.Sleep(100);
string path = @"i.bmp";
System.IO.StreamReader File = new System.IO.StreamReader(path);
System.Diagnostics.Stopwatch stw = new System.Diagnostics.Stopwatch();
while (!File.EndOfStream)
{
c = new char[32];
File.Read(c, 0, 32);
string txt = new string(c);
//string txt = Encoding.UTF8.GetString(c);
_serialPort.Write(txt);
if (txt.Length < 32) { _serialPort.Write("\r\n"); }
Thread.Sleep(100);
stw.Start();
while (_serialPort.ReadExisting()=="x" && stw.ElapsedMilliseconds<5000) ;
stw.Stop();
stw.Reset();
if (breakport == true)
{ break; }
}
File.Close();
compeletsend = true;
}[/PHP]
و اما مشکله بعد...
دیتاهای ارسالی فقط در صورت خونا بودن ارسال می شوند یعنی اگر 0 که معادل دیسمال ان 48 باشه ارسال میشه در صورتی که معادل دیسیمال کاراکتر مثلا 01 باشه بطور صحیح ارسال نمیشه و معادل کاراکتر خوانای قبلی ارسال میشه
فکر کنم مشکل از char یا بایت بودن هست،درسته؟
----
char رو به byte به همون ترتیبی که داده بودید مرتب کردم،دیسیمال معادل دیتا 5 تا اضافه شده بودند و UTF8,UTF7,UTF32,UTFASCi و خلاصه هرچی تو لیست بود تست کردم بازم مشکل داشت
نهایتا به char برگدوندم ولی هنوز مشکل ناخانا بودن رو دارم که کاراکتر های که نمیتونه بخونه 3F رو ارسال میکنه که معادل ? است
---
کسی میدونه چه باید کرد؟
شما اطلاعات را به صورت عددی بررسی کنید نه رشته ای و کاراکتری. این مورد را در بند 5 چند پست قبل نیز گفتم.
شما زمانی کع از ReadExisting استفاده می کنید آرایه ای از یابت ها دریافت می کتید. کافی است تا اعضای آن را مستقیما به int و یا رشته تبدیل کنید. آنگاه خود عدد را دارید. اما اگر از نوع کاراکتر باشد زمانی که به رشته تبدیل می شود معادل اسکی آن عدد بر می گردد.
استفاده از کلاس Encoding و UTF تنها برای تبدیل آرایه بایت به رشته بود. اما اگر هر عضو آن با استفاده از .ToString() تبدیل شوند مستقیما عدد آن باز می گردد.
موفق باشید.
با تشکر از جوابتون
اون مشکل رو حل کردم
ولی باز مشکلی دیگه ای ...
تابع mfg رو بصورت زیر تغییر دادم
[PHP] public void mfg()
--
Thread.Sleep(100);
if (!obit)
--
System.IO.StreamReader File = new System.IO.StreamReader(path);
//System.Diagnostics.Stopwatch stw = new System.Diagnostics.Stopwatch();
FileInfo f = new FileInfo(path);
c = new byte[Convert.ToInt32(f.Length)];
File.BaseStream.Read(c, 0, Convert.ToInt32(f.Length));
ny = Convert.ToInt32(f.Length);
obit = true;
}
while (nu < ny)
--
_serialPort.Write(c, Convert.ToInt32(nu), 64);
nu += 64;
Thread.Sleep(1);
try
--
while (_serialPort.ReadChar() != 'x') ;
}
catch
--
while (_serialPort.ReadExisting() != "x") ;
}
}
//File.Close();
compeletsend = true;
}[/PHP]
البته فعلا بعضی جاها رو غیر فعال کردم
اما جالبه تا عدد متغییر ny مقدار کل بایت فایل هست و اصولا می باست nu تا حد ny برسه و بعد تابع قطع بشه
اما با کمال تعجب تا عدد 5824 میره و متوقف میشه،دیتا ها تا همین بایت سالم هستان در ic ولی همینجا برنامه میمونه
هرچقدر نگاه میکنم نمیدونم مشکل از کجاست ،از دیروز صبح درگیره همینم
به نظر میرسه در خوندن فابل مشکل داره
چون من فقط 64 بایت اول بخونم و دائم همونو کپی کنم بدون مشکل میره
و با فایل های مختلف هم این عدد متفاوته
فکر نمیکنم از برنامه میکرو باشه مشکل
نکته اصلی: به جای اینکه که کل فایلتان را یکسره بخوانید و سپس آرایه آن را بخش بخش بفرستید، بهتر است تا همان 64 تا 64 تا از فایل بخوانید و در پورت سریال برزید.
نکات دیگر که بد نیست بدانید:
1- خود کلاس BaseStream طول فایل را دارد. FileInfo را می توان حذف کرد.
2- مدت زمان صبر شما برای رایت بافر پورت سریال در سخت افزار خیلی کم است( حداقل 5ms به ازای یک پکت 30 بایتی با Baudrate 38400 در Mega128 با کلاک 14.7456M - پردازش پکت خود را در میکرو بررسی کنید.زمان تقریبی در می آید.)
3- این حالت را در نظر بگیرید: طول فایل 630 بایت باشد. طول هر ارسال هم 64 بایت. آنگاه روند ارسال شما اینگونه می شود:
و اگر:کد:630/64=9
پس:کد:9*64=576
پس این 54 بایت چه می شود؟کد:630-576=54
شما می بایست در آخر این 54 بایت را نیز جداگانه از آخر آرایه خود ارسال کنید.
پس می شود: از یک حلقه استفاده کنید که به تعداد 9 بار 64 بایت را ارسال کند و در آخر 54 تای نهایی را بفرستد یعنی باقیمانده این عبارت:
موفق باشید.کد:630%64=54
با تشکر از جواب
دیگه امروز کمی منصرف شدم از نوشتن این بوت لودر
و با یک پروگرامر یونیورسال پر کردم ای سی مورد نظر رو
ولی به عنوان یک تجربه نیاز به تولید کردن این بوت لودر دارم
کد قسمت دریافت مگا 88 با کلاک 8 مگ داخلی در زیر امده
مثالی که در بالا گفته شده مربوط به یک فایل 16 کیلو بایتی است که در 5760 قفل میکندکد:while(mode==2)--
for(page=0;page<304;page++)
--
for(j=0;j<8;j++)
--
gets(buf,64);
for(i=0;i<64;i++)
--
ATD45DB161D_BufferWrite(1,i+(j*64),buf[i]);
}
if(j<7) -- delay_ms(1); puts("x"); }
}
ATD45DB161D_BufferToPage(1,page,1);
delay_ms(1); puts("x");
}
}
فعلا درنوشتن مشکل وجود دارد این قسمت که حل شد برای اون ته مانده های بایتی هم فکری میکنیم
میکرو نیز AT45DB231 را برنامه ریزی میکند که یک ای سی فلش حافظه می باشد
از این فایل 15 کیلو بایتی 5 کیلوی اول بطور صحیح در ای سی ریخته میشود ولی بعد از سکته برنامه اطلاعات بعدی غیر قابل اعتماد است
از بابت صبر کردن میبینید که میکرو بعد از کامل رسیدن 1 میلی ثانیه صبر میکند و همچنین بعد از انجام دستور اخر نیز 1 میلی صبر میکند
با برداشتن دستور دیلی نیز تا همان 5 کیلو به درستی انجام میشود
در مورد 64 بایت 64 بایت نیز مورد حل شده و به همین صورت فایل خوانده میشود