www.mikrocontroller.net

Forum: PC-Programmierung VB2008.NET - Serielle Com Port ansteuerung


Autor: Valentin Diring (valentin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich brauche unbediengt eure Hilfe.
Die Grundlagen von VB2008.NET sind mir vertraut. Ich habe es auch 
geschaft über die serielle Schnittstelle Daten zusenden, aber leider nur 
von 0 bis 127. Darüber hinaus kommt immer nur 0x3F (0b00111111).

Das Problem ist, dass ich unbedingt einen ganzen Byte senden muss!
Gibt es irgendwo so eine Funktion?

Danke schonmal im Voraus.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zeig doch mal wie du bis jetzt sendest.

Autor: Valentin Diring (valentin)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Private Sub btnSendByte_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles btnSendByte.Click
        If SerialPort1.IsOpen Then
            Dim str As String = txtSendByte.Text
            Dim CharByte As Byte

            For i As Integer = 0 To 7
                If Asc(str.Chars(i)) = Asc("1") Then
                    CharByte = CharByte Or 2 ^ (7 - i)
                ElseIf Asc(str.Chars(i)) = Asc("0") Then
                    GoTo End_If
                Else
                    MsgBox("Die Eingabe ist fehlerhaft")
End_If:
                End If
            Next
            Dim chr As Char = Convert.ToChar(CharByte)
            SerialPort1.Write(chr)
        End If

    End Sub

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vb ist zwar nicht meine stärke aber das sieht merkwürdig aus

  Dim chr As Char = Convert.ToChar(CharByte)
  SerialPort1.Write(chr)


Warum wandelst du in ein Char?

write kann auch eine byte array senden.

http://msdn.microsoft.com/de-de/library/ms143551%2...

du musst also das byte in ein bytearray stecken und dann write aufrufen

SerialPort1.Write(bytearray, 1, 1 )

weiss aber nicht wie ein bytearray in vb geht.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier wird von im Grunde demselben Problem berichtet

http://www.eggheadcafe.com/software/aspnet/3381919...

aber leider keine Lösung angegeben.
Aber es könnte dir bei der weiteren Web-recherche helfen

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vor dem Öffnen der Schnittstelle diese Zeile einfügen:

SerialPort1.Encoding = System.Text.Encoding.Default

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Markus (Gast)
Das spielt nur eine Rolle wenn man Text sendet, wenn man gleich bytes 
sendet ist das encoding egal. Bytes sind nun mal Bytes.

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Hier wird von im Grunde demselben Problem berichtet
>
> 
http://www.eggheadcafe.com/software/aspnet/3381919...
>
> aber leider keine Lösung angegeben.
> Aber es könnte dir bei der weiteren Web-recherche helfen

Die Seite liefert eigentlich die Lösung für Strings:
Passendes Encoding. Muss es eine 1:1-Umwandlung sein, ist dies nur mit 
"ISO-8859-1" bzw. 28591 zu machen 1) also
SerialPort1.Encoding = System.Text.Encoding.GetEncoding("ISO-8859-1")
bzw. z.B.
encoding = System.Text.Encoding.GetEncoding("ISO-8859-1")
strResult = encoding.GetString(byteArray)
byteArrayResult = encoding.GetBytes(strInput)

1) http://blogs.msdn.com/bclteam/archive/2006/05/26/608377.aspx

Autor: Valentin Diring (valentin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast völig recht Peter. Danke, dass du mir auf die Sprünge geholfen 
hast.

Für Alle, die das selbe Problem haben, hier ist der funktionierende 
Codeabschnitt.

Private Sub btnSendByte_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles btnSendByte.Click
        If SerialPort1.IsOpen Then
            Dim str As String = txtSendByte.Text
            Dim CharByte(0) As Byte
            CharByte(0) = 0
            For i As Integer = 0 To 7
                If Asc(str.Chars(i)) = Asc("1") Then
                    CharByte(0) = CharByte(0) Or 2 ^ (7 - i)
                ElseIf Asc(str.Chars(i)) = Asc("0") Then
                    GoTo End_If
                Else
                    MsgBox("Die Eingabe ist fehlerhaft")
End_If:
                End If
            Next
            SerialPort1.Write(CharByte, 0, 1)
        End If

    End Sub

Mit freundlichen Grüßen

Autor: FZ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
bin zwar kein VB Profi würde deine For-Schleife so nicht eleganter 
aussehen


            For i As Integer = 0 To 7
                If str.Chars(i) = "1" Then
                    CharByte(0) += 2 ^ (7 - i)
                ElseIf str.Chars(i)) <> "0" and str.Chars(i) <> "1" Then
                    MsgBox("Die Eingabe ist fehlerhaft")
                    Exit For
                End If
            Next

LG

FZ

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eleganter wäre es wenn man
2 ^ (7 - i)
durch Schieben (*2) und setzen des jeweils untersten Bits austauschen 
würde.

Autor: Julia D. (grazerin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie macht man das im .net Umfeld?

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Julia Dorfmeister schrieb:
> Wie macht man das im .net Umfeld?

VB kennt <<, >>, and, or
C#, C/C++, Ruby, Python kennen <<, >>, &, |
F# kennt <<<, >>>, &&&, |||

Oder was war die Frage?

Autor: juppi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>VB kennt <<, >>, and, or

Leider wird immer nur eine 0 geschoben.



zur Frage:
Imports System.Text    ' <=== !   nicht vergessen

   'Codeabschnitt von Rod:

    Sub SendSerialData01xxxx(ByVal data As String)
        Dim enc As Encoding = Encoding.GetEncoding(1252)
        ' Send strings to a serial port.
        Using com1 As IO.Ports.SerialPort = _
        My.Computer.Ports.OpenSerialPort("COM1", 2400, 
IO.Ports.Parity.None, 8)
            com1.Encoding = enc
            com1.Write(data)
        End Using
    End Sub
    Sub SendSerialData02(ByVal data As String)
        Dim enc As Encoding = Encoding.GetEncoding(1252)
        ' Send strings to a serial port.
        'Using com1 As IO.Ports.SerialPort = _
        ' My.Computer.Ports.OpenSerialPort("COM1", 2400, 
IO.Ports.Parity.None, 8)
        SerialPort1.Encoding = enc
        Try
            SerialPort1.Write(data)
        Catch
            MessageBox.Show("Anschluß geschlossen")
        End Try

    End Sub

Gruß

Autor: Valentin Diring (valentin)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.
Da bin ich wieder.

Nun bin ich in der Lage Daten über die serielle Schnittstelle zusenden.
Also wollte ich auch mal Daten empfangen, und stellte fest, dass es 
etwas schwiriger ist.
Ich habe zwar in der MSDN-Library gelesen, aber irgendwie klapt es 
nicht.
Beim empfangen eines Bytes kommt folgender Fehler: Der Puffer darf nicht 
NULL sein


Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, 
ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles 
SerialPort1.DataReceived
        Dim Data() As Byte
        Try
            Dim RBytes As Integer = SerialPort1.Read(Data, 0, 
SerialPort1.BytesToRead)
            lblByteCount.Text = RBytes
            For Each Value In Data
                lstReceiveData.Items.Add(Value)
            Next
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
End Sub


Hoffe, Ihr könnt mir nocheinmal helfen.

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Valentin R. schrieb:
> Hallo.
> Da bin ich wieder.
>
> Nun bin ich in der Lage Daten über die serielle Schnittstelle zusenden.
> Also wollte ich auch mal Daten empfangen, und stellte fest, dass es
> etwas schwiriger ist.
> Ich habe zwar in der MSDN-Library gelesen, aber irgendwie klapt es
> nicht.
> Beim empfangen eines Bytes kommt folgender Fehler: Der Puffer darf nicht
> NULL sein
>
>
> Private Sub SerialPort1_DataReceived(ByVal sender As System.Object,
> ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles
> SerialPort1.DataReceived
>         Dim Data() As Byte
>         Try
>             Dim RBytes As Integer = SerialPort1.Read(Data, 0,
> SerialPort1.BytesToRead)
>             lblByteCount.Text = RBytes
>             For Each Value In Data
>                 lstReceiveData.Items.Add(Value)
>             Next
>         Catch ex As Exception
>             MsgBox(ex.Message)
>         End Try
> End Sub
>
>
> Hoffe, Ihr könnt mir nocheinmal helfen.

Setze mal einen Breakpoint auf die Zeile Dim RBytes As Integer = 
SerialPort1... und sieh dir an was Data ist bzw. noch nicht ist.
Zweites Problem: Das Update der ListBox funktioniert so auch nicht, da 
das Event nicht im UI-Thread ausgelöst wird, sondern in einem eigenen 
Thread, Updates von Steuerelementen aber nur im UI-Thread durchgeführt 
werden dürfen.
http://msdn.microsoft.com/de-de/library/system.io.... 
d.h. in der Klasse wird noch etwas wie das unten stehende gebraucht
Private Delegate Sub DataReceivedDel()
Private ListUpdateHandler As New DataReceivedDel(AddressOf ListUpdate)
Private Sub ListUpdate() 
   do something
End

Private Sub SerialPort1_DataReceived(ByVal sender As System.Object,
        ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles
        SerialPort1.DataReceived
    do something
    Me.Invoke(ListUpdateHandler)
End

Autor: Valentin Diring (valentin)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Danke an Arc Net und die Anderen.
Dank Eurer Hilfe kann ich jetzt mittels serieller Schnittstelle, Daten 
senden und epmfangen.

Hier ist der Code-Ausschnitt des Empfängerteils:

Private Sub SerialPort1_DataReceived(...) Handles 
SerialPort1.DataReceived
        ReDim Data(SerialPort1.BytesToRead - 1)
        Try
            ReadedBytes = SerialPort1.Read(Data, 
0,SerialPort1.BytesToRead)
            Me.Invoke(ListUpdateHandler)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
End Sub

Private Delegate Sub DataReceivedDel()
Private ListUpdateHandler As New DataReceivedDel(AddressOf ListUpdate)
Private Sub ListUpdate()
        For Each Value In Data
            ...
        Next
End Sub


Was ich allerdings noch nicht verstehe.
Was bewirkt die Eigenschaft "WriteBufferSize"?
Ich habe zwar damit experimentiert, aber leider keine Wirkung 
festgestellt.

Vielleicht weiß es einer von Euch.

Autor: FZ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

WriteBufferSize ruft die Größe des Ausgabepuffers des seriellen 
Anschlusses ab oder legt diese fest, normal ist die Puffergröße 2048
alle Werte die kleiner sind werden ignoriert.

Grüße FZ

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.