PDA

View Full Version : کمک واسه نوشتن برنامه گرفتن اطلاعات از پورت سریال



amvaj2008
پنج شنبه 14 شهریور 1392, 11:30 صبح
سلام دوستان من دانشجوی الکترونیکم و واسه انجام یک پروژه میخوام از پورت سریال برای دریافت اطلاعات یک عکس و نشان دادن اون استفاده کنم ولی آلان مراحل آخر یعنی نشون دادن عکس انجام شده ولی مراحل اول که دریافت از پورت سریال هست کار نمیکنه و موقع وصل کردن دستگاه به پورت پیغام
run time error "6"
overflow
میده
یک مشکل دیگه من انتظار کشیدن واسه رسیدن اطلاعات که نمیدونم چطوری باید فعال بشه چون اگر داخل do loop بزارم هنگ میکنه

mehran901
پنج شنبه 14 شهریور 1392, 15:31 عصر
شما باید از کامپوننت Microsoft Comm Control استفاده کنین ، توجه به تنظیم baud rate داشته باشین و توسط event ، خاص OnComm هر وقت که اطلاعات بیاد رو پورت فراخوانی میشه و میتونید بدون استفاده از حلقه دو لوپ همه اطلاعات رو بگیرین

به این صورت که

If com1.CommEvent = comEvReceive Then
comevent = com1.Input
End if


اطلاعات ارسال شده روی پورت کام در صورتی که اطلاعات بیشتر از یک بایت باشه به صورت پکیج های جداگانه تک بایتی توسط بافر com.input گرفته میشه

amvaj2008
پنج شنبه 14 شهریور 1392, 15:44 عصر
ممنون از پاسخ تون دوست عزیز
من 230400بایت دارم که باید به کامپیوتر ارسال بشه
منظورتون از جدا سازی چیه ممنون میشم یه کم توشیح بدید.

mehran901
پنج شنبه 14 شهریور 1392, 17:17 عصر
ببینید مثلا وقتی میخواین یک بایت اطلاعات مثل مثلا کاراکترهای ABC رو درقالب یک رشته ارسال کنید ، 3 بایت اطلاعات هست ( هرچند که نیاز به توضیح این مسئله نیست ولی 3 بایت اطلاعات به این دلیل که ، هر کاراکتر متناظرا دارای یک کد اسکی هست که کد اسکیش در مبنای 2 یک عدد 8 بیتی میشه که میشه 1 بایت )

نحوه دریافتش به این صورت هست اول کاراکتر A بعد B بعد C در داخل بافر قرار میگیره

amvaj2008
پنج شنبه 14 شهریور 1392, 17:34 عصر
آقا مهران منظورم این نبود منظورم اینه که من چطوری این خط رو به برنامه ربط بدم

If com1.CommEvent = comEvReceive Then
comevent = com1.Input
End if
باید داخل زیر برنامه یا فانکشن خاصی نوشته بشه ؟
یا باید این دستورات رو داخل برنامه خودم بزارم و مرتب چک بشن؟
آخه من از کامپوننت Microsoft Comm Control استفاده کردم و از دستور MSComm1.input واسه دریافت در برنامه استفاده کردم که که خطای ذکر شده رو بهم میده

mehran901
پنج شنبه 14 شهریور 1392, 17:41 عصر
آهان ، خب ببینید دستور MSComm1.input شما همون دستور com1.input من هست ، یک event ای وجود داره ، که وقتی اطلاعات بیاد روی پورد اون اونت خودکار صدا زده میشه ... OnComm ... نیاز به حلقه نیست ... هروقت اطلاعات جدیدی بیاد خودش داخل comevent قرار میگیره ... اون قطعه کدی که نوشتم رو داخل همون oncomm بذارید ... و کل کد نویسی هاتون رو میتونید به اون بخش منتقل کنید ... اطلاعات دریافتی رو تا زمان خاصی بگیرید ( با توجه به baud rate ) ، مثلا میبینین1 ثانیه ماکزیمم طول میکشه تا عکس منتقل بشه ... و در نهایت هر یک ثانیه چک کنین که آیا عکس کامل اومده یا نه ( برای مواقعی که نویز اطلاعات رو خراب میکنه و عکس کامل نمییاد ) یا برای مشخص کردن آخر عکس موقعی که عکس رو ارسال کردین بعد از ارسال شدنش ی کاراکتر خاصی بفرستین که هروقت اون رو برنامه بگیره بفهمه عکس کامل اومده .... بعد تکه تکه اطلاعات رو به هم متصل کنید ... البته ی سرچی بزنین شاید راه های دیگه ای هم باشه واسه انتقال فایل های باینری ...

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


oncomm event :

Private Sub com1_OnComm()
If com1.CommEvent = comEvReceive Then
comevent = com1.Input
End if
End Sub


کتاب آقای کاهه 2 تا پروژه با این کامپوننت انجام داده که بد نیست بهش ی نگاهی بندازین :
AVR
مهندس کاهه

amvaj2008
پنج شنبه 14 شهریور 1392, 22:33 عصر
این دستورات جواب نداد آقا مهران
من همینجوری که به صورت کلیک میتونم اطلاعات رو از ورودی دریافت کنم ولی به صورت بایت به بایت اصلا نمیتونم نمیدونم چرا آخه اصلا زیر برنامه Private Sub MSComm1_OnComm()
If MSComm1.CommEvent = comEvReceive Then
Text1.Text = MSComm1.Input
End If
End Sub

در طول اجرای برنامه هیچ تغییری و ورودی انجام نمیشه ولی اطلاعات روی پورت موجود چون اگر یک کلید بزارم و طی فشار دادن کلید اطلاعات بافر رو بگیرم نشون میده اطلاعات رو ولی اصلا از طریق زیر برنامه بالا کار نمی کنه نمیدونم چرا

mehran901
جمعه 15 شهریور 1392, 16:45 عصر
به خاطر این که شما باید تنظیماتی رو اعمال کنین که احتمالا نکردین
تنظیماتی که بنده همیشه انجام میدم و همیشه پروژه ها به خوبی کار میکنند :

توجه کنید که baud rate بنده 57600bps بوده شما مقدار خودتون رو جایگزین کنین ... همین طورشماره پورت
آرگمان های ورودی setting اول baud rate دوم nagative رو مشخص میکنه یعنی به صورت not شده ، آرگمان بعدیش تعداد بسته های ارسالی به ازای یک بیت توازن مشخص میشه... آرگمان آخر هم بیت توازنه بسته های دریافتی و ارسالی هست ... توجه کنید که فرستنده باید مشخصات مشابه داشته باشه


With com1
.CommPort = 3
.Settings = "57600,n,8,1"
.RThreshold = 1
.SThreshold = 1
.InputLen = 1
.PortOpen = True
End With

inputlen = 1 یادتون نره و همین طور RThreshold = 1 هم درصورتی که تنظیم نشه اطلاعات دریافت نمیشه

amvaj2008
جمعه 15 شهریور 1392, 20:42 عصر
ممنون آقا مهران دیشب جواب گرفتم و برنامه رو تکمیل کردم و اشتباه من این بود که inputlen رو مقدار 0 گذاشته بودم تازه RThreshold رو هم نزاشته بودم اول که به RThreshold رسیدم دیدم اطلاعات میاد ولی نه یک بایت نه 2 بایت هرچی بود میخواست بیاد بالا بالاخره متوجه شدم که طول ورودی رو یک باید بزارم نه 0
که جواب داد .

mehran901
جمعه 15 شهریور 1392, 21:18 عصر
خواهش میکنم ...