PDA

View Full Version : ارتباط با پورت سریال



sadeghjun
شنبه 12 اسفند 1391, 01:00 صبح
سلام
من یه برنامه برای کار با پورت سریال نوشتم ولی دو تا مشکل دارم
1 - در این برنامه هر بار که کلید send زده می شه پورت سریال خونده میشه و روی یک RichTextBox نمایش داده میشه ولی هربار پاک میشه. من میخوام به خط بعدی بره و اطلاعات قبلی پاک نشه همچنین اگه خطوط زیاد شد Scroll کنه
2- کدی که من به کامپیوتر ارسال میکنم s هستش ولی این برنامه 115 نمایش میده. باید چیکار کنم؟

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

فایل های کامل پروژه:
http://s2.picofile.com/file/76744166...ghAPP.rar.html

sadeghjun
شنبه 12 اسفند 1391, 01:04 صبح
من اول متن رو توسط کاربر میگیرم سپس اونو روی RichTextBox نمایش میدم
از آقا محسن هم ممنون بخاطر پاسخش. مشکل دوم من حل شد ولی مشکل اول هنوز حل نشد
اول این جوری نوشته بودم:


RichTextBox1.Text = DataTextBox.Text

بعد به پیشنهاد دوستان این جوری:



RichTextBox1.Text = DataTextBox.Text & vbCrLf

البته این جوری هم نوشتم:


RichTextBox1.Text = DataTextBox.Text
RichTextBox1.Text = RichTextBox1.Text & vbCrLf

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

فرید نجفلو
شنبه 12 اسفند 1391, 02:50 صبح
سلام
مشکل شما از نحوه خوندن از پورته
شما تو هر بار از این دستور استفاده می کنید:
RichTextBox2.Text = SerialPort1.ReadChar
که فقط یک کاراتر از پورت می خونه و مقدار اسکی اون رو بر می گردونه
شما بهتر با کد زیر کل مقادیر موجئد پورت رو یک جا بخونید:
RichTextBox1.Text &= SerialPort1.ReadExisting()

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

SerialPort1.Encoding = System.Text.Encoding.UTF8

sadeghjun
شنبه 12 اسفند 1391, 20:40 عصر
سلام
با تشکر فراوان از فرید عزیز
با کمک شما دوستان مشکلات قبلی حل شد که تصویر برنامه به صورت زیر است:

http://s3.picofile.com/file/7676854515/03_02_2013_08_52_40_%D8%A8_%D8%B8.jpg

حالا 2 تا مشکل دیگه دارم!
من تو برنامه گفتم هر وقت کلید send زده شد اطلاعات رو ارسال و بعد بخوان به صورت زیر:



Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SendButton.Click

If Not SerialPort1.IsOpen Then
SerialPort1.Open()
End If

DataTextBox.Select()

If SerialPort1.IsOpen = True Then
Message.ForeColor = Color.Green 'set message text color
Message.Image = ok 'set message image
Message.Text = " Device Is Connected !"
RichTextBox1.Text &= DataTextBox.Text & " " & CStr(Now) & vbCrLf 'set RichTextBox1 text = DataTextBox text
SerialPort1.Write(DataTextBox.Text) 'send DataTextBox Text to device
associatedChar = ChrW(SerialPort1.ReadByte)
RichTextBox2.Text &= SerialPort1.ReadExisting & " " & CStr(Now) & vbCrLf
SerialPort1.Close() 'close seerial port to ready for use
Else
Message.ForeColor = Color.Red 'set message text color
Message.Image = err 'set message image
Message.Text = " Device Not Connected !"
End If
SerialPort1.Close()

End Sub

1- که اگر فرستنده نفرسته برنامه هنگ میکنه(منتظر میمونه تا بفرسته!).
میخوام بخش خواندن از پورت جدای از برنامه اصلی باشه و هروقت اطلاعاتی اومد نمایش بده و برنامه هنگ نکنه.(یعنی نیاز نباشه کلید send بشه تا از پورت بخونه )

2- دیتا های ارسال شده و دریافتی که در RichTextBox نمایش داده میشه scroll نمیشه. یعنی میخوام جدید ترین خط رو نمایش بده.

باید چیکار کنم؟
ممنون
من سورس کامل برنامه رو هم ضمیمه کردم.

ghayour
شنبه 12 اسفند 1391, 21:41 عصر
1- برای هنگ نکردن برنامه باید از thread ها استفاده کنید.
2- RichTextBox1.SelectionStart = RichTextBox1.TextLength
RichTextBox1.ScrollToCaret()

sadeghjun
یک شنبه 13 اسفند 1391, 00:37 صبح
سلام
ممنون ghayour جان
من برای خواندن از پورت از این دو خط استفاده می کنم:


associatedChar = ChrW(SerialPort1.ReadByte)
RichTextBox2.Text &= SerialPort1.ReadExisting & " " & CStr(Now) & vbCrLf
که associatedChar یه متعیر از نوع کاراکتر هست.
چه جوری باید از thread استفاده کنم.
شرمنده من تازه کارم!

فرید نجفلو
دوشنبه 14 اسفند 1391, 02:21 صبح
این associatedCharبه چه دردی می خوره؟
ندیدم جایی استفاده بشه ، به جز اینکه یک بایت از پورت کم می کنه!

اینم یه مثال برای نخ (تو قسمت خوندن پورت)

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SendButton.Click

If Not SerialPort1.IsOpen Then
SerialPort1.Open()
End If

DataTextBox.Select()

If SerialPort1.IsOpen = True Then
Message.ForeColor = Color.Green 'set message text color
Message.Image = ok 'set message image
Message.Text = " Device Is Connected !"
RichTextBox1.Text &= DataTextBox.Text & " " & CStr(Now) & vbCrLf 'set RichTextBox1 text = DataTextBox text
SerialPort1.Write(DataTextBox.Text) 'send DataTextBox Text to device

'___________________________________________
Dim dlg As Action = AddressOf ReadData
dlg.BeginInvoke(Nothing, Nothing)
'SerialPort1.Close() دکمه خاص خود را دارد
'___________________________________________

Else
Message.ForeColor = Color.Red 'set message text color
Message.Image = err 'set message image
Message.Text = " Device Not Connected !"
End If
'SerialPort1.Close() دکمه خاص خود را دارد

End Sub

Private Sub ReadData()
Static IsBusy As Boolean = False 'نشان دهنده مشغول بودن
If IsBusy Then Exit Sub 'اگر مشغول بود درخواست مجدد برای خواندن پورت رد می شود
Try
IsBusy = True
Dim PortData As String = SerialPort1.ReadExisting & " " & CStr(Now) & vbCrLf

Dim dlg As Action(Of String) = AddressOf AddData
Me.Invoke(dlg, {PortData}) 'دسترسی مستقیم به کنترل در نخ مجاز نمی باشد
Catch ex As Exception
Finally
IsBusy = False
End Try
End Sub

Private Sub AddData(PortData As String)
Try
RichTextBox2.AppendText(PortData)
Catch ex As Exception
End Try
End Sub



در ضمن تو قسمت باز کردن پورت از Try..Catch استفاده کنید (یک پورت غیر موجود رو تست کنید متوجه میشید)

ghayour
دوشنبه 14 اسفند 1391, 17:37 عصر
http://barnamenevis.org/showthread.php?275344-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%AC%D8%A7%D9%85%D8%B9-Threading-%D9%88-%D9%85%D8%A8%D8%A7%D8%AD%D8%AB-%D9%85%D8%B1%D8%A8%D9%88%D8%B7%D9%87-%D9%85%D8%AB%D9%84-synchronization&highlight=%D8%A2%D9%85%D9%88%D8%B2%D8%B4+thread

sadeghjun
سه شنبه 15 اسفند 1391, 20:53 عصر
ممنون ghayour و فرید جان
کدی که فرید جان داد رو من تست کردم ولی مشکل هنگ کردن بر طرف نشد.
وقتی برای خوندن پورت که از دو کد زیر استفاده می کنم:


(associatedChar = ChrW(SerialPort1.ReadByte
RichTextBox2.Text &= SerialPort1.ReadExisting & " " & CStr(Now) & vbCrLf


خط اول رو حذف می کنم هیچی در RichTextBox2 به جز زمان و تاریخ نشون نمیده! خیلی عجیبه!

sadeghjun
چهارشنبه 16 اسفند 1391, 00:06 صبح
سلام مجدد

ظاهر فعلی برنامه:

http://s2.picofile.com/file/7680529565/03_05_2013_11_44_28_%D8%A8_%D8%B8.jpg

و اما مشکلات!
من اومدم طبق آموزش اینجا (http://barnamenevis.org/showthread.p...2%D8%B4+thread)برای حل مشکل هنگ کردن برنامه (زمانی که دیتا به کامپیوتر ارسال نمیشد برنامه منتظر میماند و هنگ میکرد من میخواستم با زدن دکمه send دریافت دیتا مستقل از برنام هاصلی شروع شود) در Button1_Click یه thread تعریف کردم و آدرس اونو Recieve_Data قرار دادم بدین صورت:



Dim t As New Threading.Thread(AddressOf Recieve_Data)
t.IsBackground = True
t.Start()

و تابع Recieve_Data هم بدین صورت:




Private Sub Recieve_Data()
While True
associatedChar = ChrW(SerialPort1.ReadByte)
RichTextBox2.Text &= SerialPort1.ReadExisting & " " & CStr(Now) & vbCrLf
RichTextBox2.SelectionStart = RichTextBox2.TextLength
RichTextBox2.ScrollToCaret()
End While

End Sub


ولی وقتی برنامه رو اجرا کردم دکمه send رو زدم این پیغام رو داد:

http://s3.picofile.com/file/7680529137/03_05_2013_11_43_48_%D8%A8_%D8%B8.jpg
مشکل چیه؟!؟
یه کار دیگه هم باید کرد باید کاری کنیم که اگه Data اومد بخونه. تا بتونیم Data هم بفرستیم. ولی چه جوری باید این کار و انجام داد؟

ممنون

کد برنامه رو ضمیمه کردم.

sadeghjun
جمعه 18 اسفند 1391, 23:35 عصر
سلام
کسی نیست جواب بده!!!

ghayour
شنبه 19 اسفند 1391, 12:51 عصر
اگه بعد از تغییرات فایل کاملشو میذاشتی بهتر بود.
این مثال رو میذارم تا بتونی از روی این برای پروژه خودت thread درست کنی.

sadeghjun
پنج شنبه 22 فروردین 1392, 21:34 عصر
سلام به همه
برنامه ای که داشتم می نوشتم، کامل شد.
سورس کامل پروژه رو می ذارم برای استفاده عموم!
.
.
.
.
.
.
.
سورس کامل برنامه:
UART Tool V1.0.0 (http://nashrearzeshha.persiangig.com/other/SadeghAPP7.rar)

roya.raha
شنبه 24 فروردین 1392, 09:39 صبح
لینک خراب شده ، لطفا کنترل کنید.
تشکر

nokhodsiah2001
شنبه 24 فروردین 1392, 23:18 عصر
درود بر شما دوست گرامی
فقط یک پرسش چرا برای برنامه نمایه usb رو انتخاب کردی

پیروز باشی

sadeghjun
یک شنبه 25 فروردین 1392, 20:49 عصر
سلام
لینک مشکلی نداره!
دوباره امتحان کنید.

sadeghjun
یک شنبه 25 فروردین 1392, 20:51 عصر
درود بر شما دوست گرامی
فقط یک پرسش چرا برای برنامه نمایه usb رو انتخاب کردی

پیروز باشی


سلام
من یه پورت سریال مجازی از طریق پورت USB ایجاد کردم.
شماتیک مدار هم در قسمت Help برنامه هست.

HAMRAHSOFT.IR
جمعه 18 مرداد 1392, 22:17 عصر
سلام
من یه پورت سریال مجازی از طریق پورت USB ایجاد کردم.
شماتیک مدار هم در قسمت Help برنامه هست.

دوست خوب چطور یک پورت سریال مجازی از طریق پورت USB ایجاد کنیم

sadeghjun
دوشنبه 28 مرداد 1392, 23:10 عصر
دوست خوب چطور یک پورت سریال مجازی از طریق پورت USB ایجاد کنیم

سلام
وقتی شما سحت افزاری دارید که در اون از آی سی های شبیه ساز پورت USB استفاده شده مثل FT232 ، با اتصال سخت افزار و نصب درایور آی سی ، این پورت ساخته میشه.