PDA

View Full Version : گفتگو: مشکلی خاص و عجیب با دریافت داده از تابع mscomm



plusboy
شنبه 04 آبان 1387, 22:36 عصر
سلام مهندسین

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

اما یک مشکل وجود داره برای من و اونم اینه که نوشته ها به صورت پشت سر هم وارد می شند و امکان تفکیک برای من وجود نداره

مثلا اگر پیام salam وارد شد و بعد با فاصله زمانی پیام bye به این شکل salambye نمایش داده میشه

یک سری الگوریتم های مختلف را آزمایش کردم برای حالت مجازی و همه کار کردند اما برای این مجموع کد و در عمل جواب نگرفتم

حتی اگه بشه با هر بار دریافت داده اون را در یک text جدید تمایش بده !!

کسی میتونه من را راهنمایی کنه!!! :اشتباه:



Private Sub MSComm1_OnComm()

Dim InBuff As String
If MSComm1.CommEvent = comEvReceive Then.
InBuff = MSComm1.Input

End If
Dim y As String
Dim x As Integer

For x = 1 To (Len(InBuff) + 1)

y = Mid$(InBuff, x, 1)

If y = Chr$(13) Then
y = ""
End If

If y = Chr$(10) Then
y = ""
End If

Text1.SelStart = Len(Text1.text)
' Display text:
Text1.SelText = y

Next x



End Sub

vahid_d_0101
شنبه 04 آبان 1387, 23:08 عصر
سلام
میتونی بعد از ارسال هر پیام کلید اینتر (Enter) را هم بفرستی تا پیغام به سطر بعدی بره شاید کارکنه

vahid_d_0101
شنبه 04 آبان 1387, 23:21 عصر
میتونی این کد را توی یه تایمر بزاری که زمان تایمر برابر 1 ثانیه 1000 باشه 100درصد کار میکنه

If MSComm1.PortOpen = True Then
MSComm1.Settings = "2400,n,8,1"
s1 = MSComm1.Input
If s1 <> "" Then
Text1.Text = s1
End If
End If

l3ai3ak
شنبه 04 آبان 1387, 23:26 عصر
مشکل شما تو این کد نیست بلکه مشکل شما در بخش ارسال هست .
شما در اینجا صحبت از String می کنید در حالی که آن کنترل برای ارسال داده هست . یعنی شما در این برنامه داده های باینری رو تبدیل به String کردید .

خب برای حل مشکل شما باید سمت ارسال کننده داده ها را با وقفه بفرستید . بسیار آسان مشکلتان حل می شود . و در ضمن بهتر است از Flag کردن استفاده کنید یعنی . آخر هر سری داده یک علامت بگذارید مثلاً به قول دوستمان( Chr(13 یعنی همان Enter.

plusboy
یک شنبه 05 آبان 1387, 09:08 صبح
تشکر دوستان
من هر دو حالت را با دقت تست کردم یعنی هم از تایمر استفاده کردم و هم از Enter یا
chr(13)

زمانی که در terminal emulator تست می کنم فرمان enter به سطر بعد میرود اما در برنامه با این کد کار نمی کند


اگر بدون این سری کد استفاده کنم مثلا

s1=mscomm1.input
text1.text=s1


نوشته ها به صورت کامل نمی آیند


می تونید کدی برای من بنویسید که مثلا هر بار که طول داده تغییر کرد نوشته را از ابتدای داده جدید نمایش دهد:



welcomechoosenumber


welcome=7character choosenumber=12character





حال نمیدونم چجوری از دستور $mid استفاده کنم تا مشکی پیش نیاد؟ در حالت فرضی که مرجع input یک textbox بود این کار جواب داد اما برای این موضوع کار نکرد



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



نمونه برنامه های مختلفی از mscomm دیدم روی سایت های مختلف اما همشون به همین شکل پشت سرهم نوشته می شدند!!

و تقریبا همه از همین روش یعنی با حلقه for و $mid و حذف character های اضافی اطلاعات دریافتی را نمایش میدادند اما باز پشت سر هم!!:ناراحت:

mpmsoft
یک شنبه 05 آبان 1387, 09:13 صبح
دوست عزیز شما باید به این موارد دقت کنید

1- اول و آخر دیتا باید با کارکتری مشخص شود (جهت تفکیک)
2- شما باید تمامی اطلاعاتی رو که از پورت می گیرید رو جایی ذخیره کنید یا انتهای یک استرینگ بچسبونی
3 - یک روتین ساده باید بنویسی که این اطلاعات رو تفکیک و نمایش بده تا LosePocket نداشته باشید