PDA

View Full Version : خواندن پیاپی از پورت com (سریال)



maryam_80
جمعه 02 شهریور 1386, 06:39 صبح
با سلام

میخواستم بدانم که به چه شکل می توان از پورت سریال به صورت متداول اطلاعات را خواند
به این صورت که من یک button روی فرم دارم که با کلیک روی آن میرود و از پورت اطلاعات را می خواند(این اطلاعات مربوط به وزن جعبه بر روی ترازو می باشد) در ضمن من روی فرم کنترل comm را هم دارم.
حالا می خواهم بدون button سیستم به محض عوض شدن جعبه روی ترازو ،وزن را از روی ترازو بخواند.
در مورد خواندن از پورت و تشخیص عوض شدن جعبه فعلا مشکلی ندارم ولی نمی دونم چه طوری می توان به صورت پیاپی از پورت خواند چون من این کارها را با event oncick دکمه مربوطه انجام می دادم

آیا باید از timer استفاده کنم؟اگر جواب مثبت است به چه شکلی؟

منتظر جواب دوستان هستم

reza_hajizade
جمعه 02 شهریور 1386, 06:48 صبح
منم از دیشب با وی بی آشنا شدم
شما برای این کار می تونی با این فرضیات کار بکنی

وقتی برنامه ات رو اجرا می کنی برنامه باید منتظر وقفه ای از پورت سریال باشه ( فعلا از وقفه های پورت سریال چیزی نمی دونم )
این وقفه می تونه توسط سیستم سخت افزاری شما ( وقتی روی ترازو چیزی می ذارید در اولین بار) ایجاد بشه
اگه توی ترازو از گیج اندازه گیری وزن استفاده کرده باشی وقتی خروجی گیج رو توی یه پل اشکار سازی کردی و اون رو به یه مبدل آنالوگ به دیجیتال دادی می تونی از وقفه خود مبدل موقع اتمام عمل تبدیل اطلاعات استفاده بکنی

همین تا وقتی که جعبه روی گیج هستش ادامه داره

البته شما باید فکری برای نمونه برداری متناوب مبدل AD بکنی و این وقفه رو چک بکنی
این وقفه باید توی برنامه باعث بشه که عمل خوندن اطلاعات ادامه داشته باشه


برای این کار فقط کافیه با این رویداد وقفه برنامه وارد زیر برنامه مربوطه بشه
و توی این زیر تابع مثلا بگی اگه چند بار وقفه نیومد از اینجا خارج شو ( روی ترازو چیزی نیست )

من جای شما باشم این مسله رو به صورت سخت افزاری روی مدارم حل می کنم
من برای اینکه مشکلی نداشته باشم ( مشکلات ناشی از باز بودن زیاد پورت و تمرکز سی پی یو روی پورت .........) این کار رو می کنم
خیلی راحت اطلاعات رو از ترازو می دم به میکرو و با استفاده از اون با PC تبادل اطلاعات می کنم


اگه مسله ای بود خوشحال میشم کمک بکنم ( بیشتر سخت افزاری :لبخند: )


موفق باشی

maryam_80
جمعه 02 شهریور 1386, 15:03 عصر
من می خواهم بدانم که آیا event های کنترل comm می توان این عمل را انجام داد.یعنی از زمانیکه مثلا فرم مربوطه Load می شود برنامه شروع به چک کردن وضعیت خروجی پورت کند بدون استفاده از button

reza_hajizade
جمعه 02 شهریور 1386, 15:22 عصر
من این کنترل رو باهاش کار نکردم
باید دنبال HELP اون باشی ( حتما هست من ندیدم ولی امکان نداره نباشه )
به هر حال اصول کار اونی بود که گفتم

راستی در مورد مدارت توضیح بده مشتاقم
موفق باشی :تشویق:

mehdi_black_hat
جمعه 02 شهریور 1386, 15:27 عصر
من فکر میکنم استفاده از تایمر بهترین راه باشه !!!!!! با لود فرم تایمر فعال بشه و پی در پی پورت رو چک کنه !

PrivateSub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load
Timer1.Enabled = True
EndSub

PrivateSub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
اینجا هم کد مربوط به چک کردن پورت
EndSub

reza_hajizade
جمعه 02 شهریور 1386, 15:37 عصر
اخه از این راحت تر که همون وقفه است
هر فقط وقفه اومد اطلاعات رو از پورت بخون هر وقت نیومد بی خیال
هی که اون رو چک بکنه یه کم......:لبخندساده:
ضمنا اونوقت که سی پی یو مشغول تر از اینه که من گفتم

ضمنا شما فرض کنه که محیط ما پر از نویزه اونوقت عوض اینکه اطلاعات درست توسط پورت خونده بشه اطلاعات غلط و اشتباه وارد قسمت دریافت اطلاعات نرم افزار میشه

واسه همین اینکه با تایمر این کار رو انجام بدی کار درستی نیست

موفق باشید

maryam_80
جمعه 02 شهریور 1386, 19:19 عصر
man chetor mitoonam ba vaghfe kar knam??

reza_hajizade
جمعه 02 شهریور 1386, 19:32 عصر
ازتون امشب اجازه می خوام یه کمک مطالعه بکنم فردا در مورد این مسله مفصل براتون توضیح می دم
شرمنده من به پورت LPT کاملا وارد هستم ولی پورت سریال RS232 رو فردا رو چشمم
خوب چی کار میشه کرد بی سوادی بد دردیه :خجالت::گریه:

reza_hajizade
یک شنبه 04 شهریور 1386, 00:40 صبح
با سلام
شرمنده دیر شد
بهترین راهی که به نظرم رسید از همه جهت درسته اینه که می گم
1- همین اول یه معذرت خواهی بهتون بده کارم چون ندونسته اشتباه جواب دادم
من دنیای واقع نگر ویژوال بیسیک رو با رویه ای اشتباه گرفته بودم
توی این محیط وقتی اتفاقی میفته عکس العملی براش رخ می ده ( قانون سوم نیوتن)

واسه همین کارا خیلی راحت تره

اینجا شما برای اینکه بین کامپیوتر و سخت افزار در طی ارسال اطلاعات یه جور هماهنگی به وجود بیاری لازمه که یه نوع عمل سلام علیک ( خودمونی ) رو انجام بدی

مثل اینکه pc یه ادمه و میکرو کنترلر یه آدم دیگه
وقتی اینا بخواهند بهم چیزی بدند هر دفعه باید یکی اون یکی رو خبر بکنه به این کار می گند یه جور دست تکانی ( البته من این پروتکل (کشکی الکی ) رو واسه LPT دیدم ولی خوب واسه RS232 هم همون آش و همون کاسه )
یعنی اول PC به میکرو اطلاع می ده اماده دریافته
بعد اگه میکرو از ADC دیتا گرفت به PC اول خبر می ده و بعد دیتا رو ارسال می کنه
این جوری اطلاعات خراب نمیشه
ضمنا به این دقت بکن که بین سطوح ولتاژ TTL میکرو پورت RS232 تفاوت هست

2- معذرت خواهی دوم هم به خاطر اینکه اگه برنامه نویسی ام برا بود ( هم میکرو و هم pc که به زودی میشه ) آره اینقدر تئوری متوری نمی دادم و عوضش یه مثالی چیزی براتون می ذاشتم


بهترین نوع یادگیری یادگیری با مثاله

شرمنده
اگه مشکلی بود باز کمکی از دستم بر بیاد حتما کمک می کنم

موفق باشید

maryam_80
یک شنبه 04 شهریور 1386, 17:03 عصر
شاید همیشه اول Search کردن بهترین راه باشه و خوبیش اینه که منتظر خواب نمیمونی و در عرض چند دقیقه به بهترین جوابها می رسی!
توی همین انجمن بارها در این باره (Com port) صحبت شده!


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

باز هم متشکرم

reza_hajizade
دوشنبه 05 شهریور 1386, 12:17 عصر
بله حرف شما درسته
فقط.............. بیخیال مشکل دوستمون که حل شد
موفق باشید :لبخندساده:

maryam_80
سه شنبه 06 شهریور 1386, 03:02 صبح
ممنون از توجه دوستان
من در ابتدا با Event کنترل Mscommکار کردم و کد زیر را در آن نوشتم ولی به صورت random جواب می داد برای همین مجبور شدم تا از timer استفاده کنم


Private Sub MSComm1_OnComm()
Dim InputValues As String
Dim OutPutValues As String
Dim wValueLine() As String
InputValues = MSComm1.Input
wValueLine = Split(Trim(InputValues), Chr(13))
OutPutValues = Trim(Mid(wValueLine(0), 2, Len(wValueLine(0))))
If InStr(OutPutValues, "M") = 0 Then
CurrentWeight = OutPutValues
End If
If Mid(Trim(CurrentWeight), 1, Len(CurrentWeight) - 2) <> "" Then
weight.Lbl_weight.Caption = CurrentWeight
End If
MSComm1.InBufferCount = 0
End Sub

اشکال کار کجاست؟

khandaye
پنج شنبه 15 شهریور 1386, 03:57 صبح
دوستان با سلام من اولین نوشته ای هست که توی این سایت می نویسم امیدوارم بتونم کمکتون بکنم
شما چند راه برای ارتباط با کامپیوتر داری ساده ترین اونا پورت ار اس 232 و تا حدودی مشکل ترین پورت یو اس بی هست
خوب بزارید یکی یکی رو توضیح بدم ولی خب اینو بگم خیلی خوشحال میشم اگر استاید محترم اگر مشکلی هست بهم بگن

پورت ال پی تی که نصلش منقزض شده و دیگه تقریبا روی هیچ مادر برد جدیدی نیست داده رو به صورت موازی ارسال میکرد در ضمن خیلی هم حساس بود این جوری که با کوچکترین اشتباه سخت افزاری می سوخت ( همین بلا سر خودم اومده) دیگه کسی از اون استفاده نمیکنه

پورت ار اس 232 که الان خیلی ها با اون کار میکنن خیلی کار با اون راحته شما یک کامپوننت mscomm رو توی پورژه اد میکنی و بعد شروع میکنی به تنظیم اون
خب تنظیمات شما چیه یکی شمراه پورت باود مورد استفادت و چیزای دیگه مثل فعال بودن پورت های وضعیت و غیره
اگه سورس کامل برنامه اونو می خواین با هام تماس بگیرین esmailiha@yahoo.com

امام ار اس 232 هم مشکلاتی داره اولا این که خروجی اون تی تی ال نیست و شما برای این که به ای سی های تی تی ال اونو وصل کنین باید از ای سی هایی مثل ماکس 232 استفاده کنید تقریبا هیچ جریانی بهتون نمی ده و در صورتی که کوچکترین جریانی از اون بکشین فورا افت ولتاژ پیدا میکنه

پیشنهاد من استفاده از پورت یو اس بی هستش با یک میکرو ای وی ار
جدیدا شرکت اتمل یه سری ای سی زده مخصوص ارتباط میکرو با سیستم که خیلی عالیه ولی برای کاربرای حرفه ای به چند علت اول این که برنامه داخلی میکرو اونو کد ویژن هست و چیزی حدود 1800 خط اگر بخوای کار کنی چیزی سر در نمیاری همچنین برا ی اینتر فیس برنامه هم چن تا دی ال ال بهت میده که کار باهاشون وقت گیره

اما
اما
یه سری ای سی توی بازار وجود داری به نام اف تی ... که می تونه 232 یا 245 یا ... باشه کار این ای سی اینه که دستگاه شما با اون به پورت یو اس بی وصل میشه تا 500 میلی می تونه جریان بکشه و می تونه از تمام خصوصات پوذت کام استفاده کنه در حالی که در روی سیستم اونو به اسم پورت کام میشناسه و شما به همون راحتی کار با پورت کام با اون کار میکنین یعنی هم شما خوبی های برنامه نویسی پورت کام رو دارین و هم مزایای استفاده از پورت یو اس بی من خودم توی ده ثانیه 64000 کارکتر ارسال و عین همون رو دریافت کردم بدون هیچ خطایی

البته من از میکرو مگا32 استفاده کردم و بسکام
دوستان اگر کسی اطلاعات کامل تری می خواد می تونه با هام تماس بگیره خوشحال میشم بتونم کمک کنم . یا حق

khandaye
پنج شنبه 15 شهریور 1386, 04:08 صبح
مثل این که من تازه کرام و از موضوع پرت خب فکر میکنم برنامه شما به خاطر استفاده نکردن از بافر این مشکل براش ایجاد شده نگاه کنید دریافت شما خیلی سریعه و وی بی نمی تونه سریع محاسبات و کارای شما رو انجام بده شما باید برای کامپوننت خودتون یه بافر تعریف کنید توی پروپرتیز خودش هست سایز بافر رو فکر میکنم بتونین تا 32500 بالا ببرین که البته لازم نیست و برای برنامه های کوچیک تا 500 هم کافیه
در ضمن یه تایمتر می تونه کل برنامه شما رو به هم بریزه تایمر شما از کجا می دونه کی اطلاعات میاد و کی اطلاعات قطع شده اینم یادتون باشه دقت یه تایمر یک میلی ثانیه هست در حالی که پورت ار اس 232 در حالت پیش فرض یعنی باود 9600 می تونه 9600 بایت رو توی یه ثانیه ترانسفر کنه یعنی توی هر یک میلی ثانیه 9.6 یعنی با استفاده از یه تایمر شما یکی از 9 تا رو می خونی اونم اگر بدون خطا بخونی

raminrayat
یک شنبه 27 شهریور 1390, 10:55 صبح
سلام ایا تو بیسکام دستوری هست که بشه باهاش در هنگام اجرای برنامه هروقت عددی مثل 1 یا2....6 از پورت کامپیوتر که توسط max 232 به پایه های rxd ,txd میکرو mega32 متصل هستندبدون اینکه اجرای دستورات (تا رسیدن اطلاعات از پورت سریال کامپیتر) متوقف شود خواند.یعنی مثل دستورات a=waitkey() عمل نکند ومیرو تا رسیدن عدد صبر نکند.

اخه من می خوام میکرو هر لظه دما رو بخونه و بده به کامپیوتر و تو labview نمایش بده .از طرفی labview اگه عدد 1 رو فرستاد به میکرو .portd.0 ست بشه .اگه 2 رو فرستاد ریست بشه.اگه 3 رو فرستاد portd.1 ست بشه و.....تا 6 عدد