Hallo! Ich möchte mit Visual Basic 2005 meinen SerialPort1 einlesen. Wie mache ich das , damit ich keinen timer benötige, der ständig abfrägt, ob bereits Daten im Empfangsbuffer angekommen sind?! Dieses Byte soll er dann in eine Textbox schreiben. Ich möchte es mit der "ReadByte()"methode vom Objekt "SerialPort1" machen, da ich immer nur ein Byte einlesen will. Etwa so: TextBox1.Text = SerialPort1.ReadByte Vielen Dank!
DataReceived Event behandeln und dann mit ReadExisting einlesen. Das Update der TextBox muss dann mit Invoke erfolgen, da das Event aus einem anderen Thread kommt.
hm danke erstmal, versteh ich nicht so ganz wie das mit dem Update funktionieren soll von der Textbox.... Kannst mir das mal anhand eines kurzen Codes erklären? Danke!
Roger G. (Gast Ziehe 3 Labels ,Timer und Com auf die Form Der Timer schreibt nur die Daten in das Label(textbox) Imports System Imports System.Text ' <=== ! Public Class Form1 Dim daten As Byte Dim t_zahl, zahl As Integer Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick t_zahl = t_zahl + 1 If t_zahl = 100 Then t_zahl = 0 End If Label3.Text = "Datenempfang Aktiv " & zahl Label1.Text = "Datenwert" Label2.Text = daten End Sub Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived zahl = zahl + 1 If zahl = 100 Then zahl = 0 End If daten = SerialPort1.ReadByte() SerialPort1.DiscardInBuffer() ' Label2.Text = daten 'fehler End Sub Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed SerialPort1.Close() End Sub Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load SerialPort1.Open() End Sub End Class Vielleicht hilft es ? Gruß
Müsste in VB ungefähr so aussehen (wenn die Syntax stimmt, arbeite normalerweise nicht mit VB)
1 | public class MyForm |
2 | Dim WithEvents serialPort As New IO.Ports.SerialPort |
3 | |
4 | Private Sub DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles serialPort.DataReceived |
5 | MyTextBox.Invoke(New MyUpdateDelegate(AddressOf UpdateText), New Object() {}) |
6 | End Sub |
7 | |
8 | Public Delegate Sub MyUpdateDelegate() |
9 | Public Sub UpdateText() |
10 | MyTextBox.Text = serialPort.ReadExisting |
11 | End Sub |
@Arc Net (arc) Habe das als Denkanstoß genommen. Nach einigen Änderungen und Versuchen konnte ich ASCII werte bis 127Dez einlesen. Jetzt habe ich Urlaub,danach greife ich dies noch einmal auf, um alle Werte einlesen zu können (0-255). Manchmal ist es gut ohne Timer zu arbeiten. Roger G. (Gast) Gib nicht so schnell auf. VB.Net ist anfangs schwer zu verstehen. Gruß
..... wrote: > @Arc Net (arc) > > Habe das als Denkanstoß genommen. > Nach einigen Änderungen und Versuchen konnte ich ASCII werte bis 127Dez > einlesen. > Jetzt habe ich Urlaub,danach greife ich dies noch einmal auf, um alle > Werte einlesen zu können (0-255). > Manchmal ist es gut ohne Timer zu arbeiten. > > Roger G. (Gast) > > Gib nicht so schnell auf. > > VB.Net ist anfangs schwer zu verstehen. > > Gruß SerialPort verwendet als Standard ASCIIEncoding d.h. nur Werte von 0-127 kommen durch. Also SerialPort.Encoding mit Encoding.GetEncoding(28591) (iso-8859-1) umstellen, oder mit den entsprechenden "Byte-Routinen" arbeiten (BytesToRead, Read, Write etc.).
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.