PDA

نسخه کامل مشاهده نسخه کامل : خواندن محتویات فایل متنی



معشوقه
28-05-2012, 13:00
با عرض سلام.چطور میتونم text box ایجاد کنم و در یه برنامه دیگه اون متنی که در text box قبلی تایپ شده را ببینم.(2با استفاده از نرم افزار).
یعنی با یه نرم افزار text box ایجاد کنیم بعد هر چیزی که داخل اون تایپ میکنیم داخل یه فایل ذخیره بشه(فایل آرایه).بعد با یه نرم افزار دیگه بتونیم محتوای اون فایل رو ببینیم.
میشه تحت شبکه نباشه.؟

senaps
28-05-2012, 22:26
سلام....
سوال شما رو بازم نفهمیدم که ماجراش چیه!!

۱- یک برنامه دارین و دو فرم؟!

۲- کلا دو تا برنامه‌ی جدا دارین؟!

اگر حالت اول هستش که خیلی ساده میتونین یه متغییر تو کلاس فرم دوم درست بکنین به صورت پابلیک، بعد مقدار تکست باکس رو بریزین توش...حالا میشه مقدار تکست باکس تو فرم دیگه رو برابر با مقدار معادل متغییر ایجاد شده در فرم اول قرار بدین....!!!!
مثلا، تو فرم یک، یک متغییر به نام MainText ایجاد میکنین.... بعد میاین مینویسین: MainText=TextBox1.Text; حالا میاین تو فرمی که میخواین تو تکست باکسش، مقدار اون یکی فرم رو بنویسین.... یه متغییر ایجاد میکنینSubText...و بعد اینجوری عمل میکنین(فرض اینکه فرم اول، اسمش MainForm هستش...!) : SubText=MainForm.MainText; اینجوری مقدار مورد نظر میاد توی SubText قرار میگیره....حالا میگیم TextBox1.Text-SubText; و به همین سادگی....
(روش سخت بود این....! روش راحت اینه که از یه متغییر استاتیک! استفاده کنی!)

اگر حالت دوم باشه، شخصا اگر من باشم، برنامه‌ اول رو دیتاش رو توی یک فایل متنی ذخیره میکنم....تو برنامه دوم یه تایمر میذارم که هر مثلا چند مدت یک بار(۵ دقیقه یا ۵ ثانیه یا....) محتوی اون فایل متنی رو بخونه و نمایش بده...
من استاتیک ها رو درست نفهمیدم ولی فکر نکنم که بشه تو اینجور برنامه‌ای از قابلیت متغییر استاتیک استفاده کرد... البته برا حالت اولی میشه...چون برنامه همون یکیه... ولی برای حالت دوم هر برنامه برا خودش یه دونه کلاس جدا داره و اون استاتیک ها رو یه جور پر میکنه...

Payman_62
29-05-2012, 16:24
سلام.
لطفا برای تاپیک خود عنوان مناسب انتخاب کنید.

اگه محتویات تکس باکس رو داخل فایل ذخیره میکنید توسط کلاس System.IO میتونید اون فایل رو بخونید.

معشوقه
29-05-2012, 17:08
ممنونم از توضیحتون.ولی متوجه نشدم!!!! از دو برنامه جدا گانه استفاده میشه.میشه با دو برنامه توضیح بدین؟کداشو میشه بنویسین؟مرسیییییی

senaps
30-05-2012, 10:08
دوست عزیز، اینجا ما فقط میتونیم در حد الگوریتم یا یه خط کد بهتون راهنمایی بدیم!! نمیشه کل پروژه رو نوشت...
۲ تا پیشنهاد دارم براتون:

۱- اگر میخواین یه چیزی سر هم کنین و بدین دست استاد، فایل کتاب هاشمیان(اموزش سی شارپ) رو دانلود کنین....مستقیم برین به سرفصل باکس های Open و Save و کدهای مربوطه رو که فک کنم ۸ خط کد(هر دو برنامه روی هم!!) باشه رو کپی کنین تو پروزه و ببرین تحویل بدین...کاتب هاشمیان این دو قسمت رو به صورت فول کد نویسی اموزش داده و شما تو ۵ دقیقه فقط با کپی پیست متن کتابش میتونی برنامه رو اماده کنی...

۲- اگر میخواین یاد بگیرین، شروع بکنین به برنامه نویسی و هر جا گیر کردین برگردین تو همین تاپیک بپرسین...

اینجا شما تا کاری نکرده باشین، در حد الگوریتم جواب میگیرین و البته چون اکثرا همون الگوریتم رو هم ناقص بهمون بدن، برامون کافیه عادت کردیم که توضیح بدیم..... دست به کار بشین تا کمک های کدی دوستان هم برسه!!!!

n340
02-07-2012, 09:18
دوستان در مورد خوندن قسمتی از یک فایل بزرگ کسی میتونه راهنمایی کنه
به فرض 500 بایت اول یک فایل wav و ارسال اون
به C#

عــــلی
02-07-2012, 10:19
بنام خدا.
سلام.

دوستان در مورد خوندن قسمتی از یک فایل بزرگ کسی میتونه راهنمایی کنه
به فرض 500 بایت اول یک فایل wav و ارسال اون
به C#
میتونید از FileStream استفاده کنید از هرکجا که دوست داشتید هر قسمتو که خواستید بخونید ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])

n340
02-07-2012, 15:42
هرکار میکنم خطا میده که این Seek رو نمیشناسه
نهایتا با


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

Msba
02-07-2012, 18:48
طبق بیان یکی از اساتید .net که یادم نیست کدومشون بود در کتابش گفت که خواندن هر فایلی تا فضای 1GB رو می شه سنکرون انجام داد. یعنی یکهو متد Read رو صدا بزنیم. و برای فضاهای بالاتر بهتر است که آسنکرون کار کنیم. برای سنکرون خوندن مثل زیر می شه کد نوشت:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حالا 500 بایت رو خوندیم. اگر هم بخواهیم آسنکرون کار کنیم می تونیم این طوری بنویسیم:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اون struct رو برای این تعریف کردم که خود فایل هم بتونم بعدا هندل کنم(مثلا ببندمش.) اما اگر نمی خواهید فایل رو ببندید می تونید در آرگومان BeginRead فقط ba رو منتقل کنید.
یادآوری:تا زمانی که خواندن کامل نشده باشد متد ReadComplete اجرا نخواهد شد.
چون اضافه کردن به ListBox توسط یک ریسمان دیگر انجام می شود فراموش نکنید که یا invoke کنید و یا اینکه مثل زیر خطای تداخل Thread ها را غیر فعال کنید:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

خیلی مشتاقم بدونم 500 بایت اول فایل wav به چه درد می خوره ؟

موفق باشید.

god of war 2
02-07-2012, 19:23
خیلی مشتاقم بدونم 500 بایت اول فایل wav به چه درد می خوره ؟
ساختار فایل wav:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

n340
11-08-2012, 16:28
با سلام
تا به اینجا مشکل حل شد
گام بعدی ارسال اطلاعات به پورت سریال است
در مورد ارسال مشکلی ندارم
ولی در مورد دریافت با مشکل برخوردم
کسی از دوستان میتونه برای دریافت پورت کام مثالی بزاره یا در تاپیک دیگری پیگیری کنم ارسال دریافت رو

خب در مورد 500 بایت اول فایل wav
من کارم ساخت عدوات الکترونیک هستش
البته در بعد صنعتی
حال نیاز به ای سی با حجم بالا دارم و می بایست محتویات یک فایل با حجم 2 مگ رو درون این ای سی بریزم
پس نیاز هست مثلا 100 بایت 100 بایت اطلاعات رو خوانده و ارسال کنم به میکرو و میکرو بعد از دریاقت صحیح اطلاعات یک ok به پورت سریال ارسال کند تا برنامه تشخیص دهد که ارسال صحیح بود و به سراغ 100 بایت بعدی برود.

Msba
11-08-2012, 21:09
شما از رویداد آمدن اطلاعات پورت سریال استفاده کن.
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
درون این while بایت های پورت سریال رو بردارید.
برای کارتان پکت تعریف کنید. مثلا اگر اول 0x50 اومد بعد 0xaa اومد بعد 0x55 اومد یعنی اطلاعات درسته. اگر هم 0x50 اومد بعد 0xbb اومد بعد 0x55 اومد میکرو می گه دیتای دریافتیش خراب هست.
شما اطلاعات رو بفرستید. بعد روند ارسال رو متوقف کنید(مثلا یک متغیر رو بررسی کنید اگر true شده بود برید سراغ بایت های بعدی). میکرو که پاسخ داد همان متغیر را بسته به شرایط تغییر دهید( اطلاعات درست آمده یا نه) اگر پاسخ صحیح آمد حلقه ی ارسال اطلاعات رو ادامه دهید. برای متوقف کردن می تونید یک while روی متغیر قرار دهید.
حتما در برنامه های کند نظیر این از چند ریسمان یا چند پشت کار کن یا چند وظیفه استفاده کنید. این گونه ریسمان اصلی درگیر نمی شود.

موفق باشید.

n340
12-08-2012, 10:30
حتما در برنامه های کند نظیر این از چند ریسمان یا چند پشت کار کن یا چند وظیفه استفاده کنید. این گونه ریسمان اصلی درگیر نمی شود.


من هنوز زیاد به اصطلاحات فنی C# وارد نشدن در این مورد توضیح می فرمایید

n340
12-08-2012, 14:15
پروژه ای در این رابطه پیدا کردم که فکر کنم با تایم اوت مقدار دریافتی را دائم میخواند

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

ولی کمی به مشکل برخوردم ،برای دریافت اطلاعات ارسالی بعد گذشت کمی زمات برنامه به مشکل برمیخورد و به خط زیر اشکال میگیرد


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

فکر کنم اطلاعات ارسالی می بایست حتما \r\n رو داشته باشند تا به عنوان خط خونده شوند

Msba
12-08-2012, 14:19
ریسمان همان Thread است.پشت کار کن همان BackgroundWorker هست.وظیفه هم Task.مختصری از مختصرات کلیات برنامه نویسی موازی:یک برنامه ی ساده تنها یکسری کد را پشت هم اجرا می کند. حال اگر بخواهیم چندین کد به صورت همزمان اجرا شوند یکی از موارد بیان شده مفید خواهد بود. برنامه شما در حالت عادی به کاربر پاسخ می دهد در نتیجه نباید متوقف شود چرا که توقف آن باعث می شود برنامه Not Responding شود. پس باید این روند ها را توسط یکسری کد دیگر اجرا کرد تا کد اصلی درگیر نشود.موفق باشید.

Msba
12-08-2012, 14:22
شما از ReadLine استفاده نکن. این متد برای سیستم ارسال رشته مناسب است نه ارسال بایت شما با توابعی نظیر putchar در میکرو مقادیر را بفرستید و در رایانه از ReadExisting استفاده کنید. این متد هرچه درون بافر است را می خواند.

n340
12-08-2012, 17:42
برنامه رو به شکل زیر نوشتم


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

خب تا اینجا فایل m رو میخونه و ارسال میکنه به پورت سریال و مشکلی وجود نداره
فقط اضافه کردن این پخش اخر کی سخته که 20 بایت رو ارسال کنه و صبر کنه برای ok از سمت گیرنده و ارسال 20 بایت بعدی
فکر کنم به همون ترید نیاز باشه،ولی من در این مورد اصلا اطلاعاتی ندارم
مثالی دارید
کل پروژه رو ضمیمه هم کردم
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

n340
12-08-2012, 18:12
مشکل به نظر حل شد

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

Msba
12-08-2012, 21:01
من فرصت نکردم برنامه شما رو کامل بررسی کنم. اما چند نکته رو در کدهاتون دیدم که یادآورم:
1- از متغیر char برای اطلاعات خام استفاده نکنید. برای اطلاعات خام از byte استفاده کنید.
2- لیست پورت های موازی را دستی ندهید. بلکه comboBox رو با استفاده از همان کلاس serialPort کامل کنید. این کلاس یک متد استاتیک برای بدست آورن پورت های سریال رایانه دارد.
3- حلقه قفل شما امن نیست. اگر اطلاعاتی نیاید چه می شود؟ تا قیامت آن قسمت می ماند!!!!!
4- مدت زمان Timeout شما کم است. شما حداقل 500ms درج کنید.
5- از رشته برای بررسی پکت های سریال استفاده نکنید. چون مقادیر عددی را نمی توانید خوب در اختیار بگیرید.
6- همیشه ی همیشه نیازی به invoke نیست. شما کافیست تا عنصر مورد نظر را توسط پراپرتی InvkoeRequired بررسی کرده و در صورتی که نیاز است invoke کنید.

طبق بیان شما برنامه کار می کند. اما سعی کنید موارد بالا را نیز بررسی کنید.
بخشی از کد شما را تغییر دادم که در زیر قرار می دهم:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
این طوری حلقه بررسی شما قفل نمی کنه. یک متغیر هم اضافه کنید که اگر 2 بار دیتا ارسال شد و ok نیامد خطا دهد و ارسال متوقف گردد.


موفق باشید.

n340
12-08-2012, 21:33
با تشکر از وقتی گزاشتید،برنامه رو به تکمیلی میرود
فقط یک مورد مشکل برخوردم
به byte کردن متغییر اولیه و همچنین دو خط بعد برنامه به مشکل برخورد و ارسالی نداشت که دوباره به char برگرداندم
دلیل استفاده از بایت و تبدیل ان به UTF چیست؟

نهایتا بصورت زیر تغییرات اعمال شد

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و چند سوال ،در قسمت بالا من ترید t رو ساخته و t رو استارت میزنم ،کجا میتونم این t رو کنسل کنم که اصلا دیگر تابع mgf فراخوانی نشود
و textbox نمایش را چگونه میشود تنظیم نمود تا متن جدید را دنبال کند و پیغام های جدید را نمایش دهد کند.
مقایسه رشته "ok" مشکل داشت و نهایتا با ارسال "x" خاتمه دادم موضوع ارسال رو
و در مورد بیت خطا نیازی به این بیت نیست چون ممکنه میکرو پیغام هایی رو به حالت تکست هست بخواد ارسال کته،و مصرفی جز دیدن کاربر ندارد
و در اخر چگونه میشود از browse استفاده کرد

n340
13-08-2012, 13:11
مشکلی که برخوردم اینه که
x از سمت میکرو ارسال میشه
برنامه هم نشون میده ولی تشخیص نمیده
که x اومده و به سراغ بایت بعدی بره

n340
13-08-2012, 15:49
مشکل بالا با تغییرات زیر حل شد ،تا مشکل بعدی :20:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

n340
13-08-2012, 22:53
و اما مشکله بعد...
دیتاهای ارسالی فقط در صورت خونا بودن ارسال می شوند یعنی اگر 0 که معادل دیسمال ان 48 باشه ارسال میشه در صورتی که معادل دیسیمال کاراکتر مثلا 01 باشه بطور صحیح ارسال نمیشه و معادل کاراکتر خوانای قبلی ارسال میشه
فکر کنم مشکل از char یا بایت بودن هست،درسته؟
----
char رو به byte به همون ترتیبی که داده بودید مرتب کردم،دیسیمال معادل دیتا 5 تا اضافه شده بودند و UTF8,UTF7,UTF32,UTFASCi و خلاصه هرچی تو لیست بود تست کردم بازم مشکل داشت
نهایتا به char برگدوندم ولی هنوز مشکل ناخانا بودن رو دارم که کاراکتر های که نمیتونه بخونه 3F رو ارسال میکنه که معادل ? است
---
کسی میدونه چه باید کرد؟

Msba
15-08-2012, 14:22
شما اطلاعات را به صورت عددی بررسی کنید نه رشته ای و کاراکتری. این مورد را در بند 5 چند پست قبل نیز گفتم.
شما زمانی کع از ReadExisting استفاده می کنید آرایه ای از یابت ها دریافت می کتید. کافی است تا اعضای آن را مستقیما به int و یا رشته تبدیل کنید. آنگاه خود عدد را دارید. اما اگر از نوع کاراکتر باشد زمانی که به رشته تبدیل می شود معادل اسکی آن عدد بر می گردد.
استفاده از کلاس Encoding و UTF تنها برای تبدیل آرایه بایت به رشته بود. اما اگر هر عضو آن با استفاده از .ToString() تبدیل شوند مستقیما عدد آن باز می گردد.

موفق باشید.

n340
15-08-2012, 15:51
با تشکر از جوابتون
اون مشکل رو حل کردم
ولی باز مشکلی دیگه ای ...
تابع mfg رو بصورت زیر تغییر دادم


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
البته فعلا بعضی جاها رو غیر فعال کردم
اما جالبه تا عدد متغییر ny مقدار کل بایت فایل هست و اصولا می باست nu تا حد ny برسه و بعد تابع قطع بشه
اما با کمال تعجب تا عدد 5824 میره و متوقف میشه،دیتا ها تا همین بایت سالم هستان در ic ولی همینجا برنامه میمونه
هرچقدر نگاه میکنم نمیدونم مشکل از کجاست ،از دیروز صبح درگیره همینم

n340
16-08-2012, 15:25
به نظر میرسه در خوندن فابل مشکل داره
چون من فقط 64 بایت اول بخونم و دائم همونو کپی کنم بدون مشکل میره
و با فایل های مختلف هم این عدد متفاوته
فکر نمیکنم از برنامه میکرو باشه مشکل

Msba
16-08-2012, 16:51
نکته اصلی: به جای اینکه که کل فایلتان را یکسره بخوانید و سپس آرایه آن را بخش بخش بفرستید، بهتر است تا همان 64 تا 64 تا از فایل بخوانید و در پورت سریال برزید.
نکات دیگر که بد نیست بدانید:
1- خود کلاس BaseStream طول فایل را دارد. FileInfo را می توان حذف کرد.
2- مدت زمان صبر شما برای رایت بافر پورت سریال در سخت افزار خیلی کم است( حداقل 5ms به ازای یک پکت 30 بایتی با Baudrate 38400 در Mega128 با کلاک 14.7456M - پردازش پکت خود را در میکرو بررسی کنید.زمان تقریبی در می آید.)
3- این حالت را در نظر بگیرید: طول فایل 630 بایت باشد. طول هر ارسال هم 64 بایت. آنگاه روند ارسال شما اینگونه می شود:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و اگر:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
پس:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
پس این 54 بایت چه می شود؟
شما می بایست در آخر این 54 بایت را نیز جداگانه از آخر آرایه خود ارسال کنید.
پس می شود: از یک حلقه استفاده کنید که به تعداد 9 بار 64 بایت را ارسال کند و در آخر 54 تای نهایی را بفرستد یعنی باقیمانده این عبارت:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

موفق باشید.

n340
16-08-2012, 18:21
با تشکر از جواب
دیگه امروز کمی منصرف شدم از نوشتن این بوت لودر
و با یک پروگرامر یونیورسال پر کردم ای سی مورد نظر رو
ولی به عنوان یک تجربه نیاز به تولید کردن این بوت لودر دارم

کد قسمت دریافت مگا 88 با کلاک 8 مگ داخلی در زیر امده

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
مثالی که در بالا گفته شده مربوط به یک فایل 16 کیلو بایتی است که در 5760 قفل میکند
فعلا درنوشتن مشکل وجود دارد این قسمت که حل شد برای اون ته مانده های بایتی هم فکری میکنیم
میکرو نیز AT45DB231 را برنامه ریزی میکند که یک ای سی فلش حافظه می باشد
از این فایل 15 کیلو بایتی 5 کیلوی اول بطور صحیح در ای سی ریخته میشود ولی بعد از سکته برنامه اطلاعات بعدی غیر قابل اعتماد است
از بابت صبر کردن میبینید که میکرو بعد از کامل رسیدن 1 میلی ثانیه صبر میکند و همچنین بعد از انجام دستور اخر نیز 1 میلی صبر میکند
با برداشتن دستور دیلی نیز تا همان 5 کیلو به درستی انجام میشود
در مورد 64 بایت 64 بایت نیز مورد حل شده و به همین صورت فایل خوانده میشود