Forum: PC-Programmierung VB2005 - SerialPort1 einlesen


von Roger G. (Gast)


Lesenswert?

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!

von Arc N. (arc)


Lesenswert?

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.

von Roger G. (Gast)


Lesenswert?

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!

von ..... (Gast)


Lesenswert?

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ß

von Arc N. (arc)


Lesenswert?

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

von Roger G. (Gast)


Lesenswert?

Bahnhof.....

trotzdem danke für die Mühe :-(

von ..... (Gast)


Lesenswert?

@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ß

von Arc N. (arc)


Lesenswert?

..... 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
Noch kein Account? Hier anmelden.