mikrocontroller.net

Forum: PC-Programmierung VB2005 - SerialPort1 einlesen


Autor: Roger G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Roger G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: ..... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Müsste in VB ungefähr so aussehen (wenn die Syntax stimmt, arbeite 
normalerweise nicht mit VB)
public class MyForm
    Dim WithEvents serialPort As New IO.Ports.SerialPort

    Private Sub DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles serialPort.DataReceived
        MyTextBox.Invoke(New MyUpdateDelegate(AddressOf UpdateText), New Object() {})
    End Sub

    Public Delegate Sub MyUpdateDelegate()
    Public Sub UpdateText()
        MyTextBox.Text = serialPort.ReadExisting
    End Sub

Autor: Roger G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bahnhof.....

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

Autor: ..... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht 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.).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.