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


von Valentin D. (valentin)


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.

von Peter (Gast)


Lesenswert?

zeig doch mal wie du bis jetzt sendest.

von Valentin D. (valentin)


Angehängte Dateien:

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

von Peter (Gast)


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%28VS.80%29.aspx

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.

von Karl H. (kbuchegg)


Lesenswert?

Hier wird von im Grunde demselben Problem berichtet

http://www.eggheadcafe.com/software/aspnet/33819191/serielle-schnittstelle-z.aspx

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

von Markus (Gast)


Lesenswert?

Vor dem Öffnen der Schnittstelle diese Zeile einfügen:

SerialPort1.Encoding = System.Text.Encoding.Default

von Peter (Gast)


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.

von Arc N. (arc)


Lesenswert?

Karl heinz Buchegger schrieb:
> Hier wird von im Grunde demselben Problem berichtet
>
> 
http://www.eggheadcafe.com/software/aspnet/33819191/serielle-schnittstelle-z.aspx
>
> 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

von Valentin D. (valentin)


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

von FZ (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

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

von Julia D. (Gast)


Lesenswert?

Wie macht man das im .net Umfeld?

von Arc N. (arc)


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?

von juppi (Gast)


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ß

von Valentin D. (valentin)


Angehängte Dateien:

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.

von Arc N. (arc)


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.ports.serialport.datareceived(VS.80).aspx 
d.h. in der Klasse wird noch etwas wie das unten stehende gebraucht
1
Private Delegate Sub DataReceivedDel()
2
Private ListUpdateHandler As New DataReceivedDel(AddressOf ListUpdate)
3
Private Sub ListUpdate() 
4
   do something
5
End
6
7
Private Sub SerialPort1_DataReceived(ByVal sender As System.Object,
8
        ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles
9
        SerialPort1.DataReceived
10
    do something
11
    Me.Invoke(ListUpdateHandler)
12
End

von Valentin D. (valentin)


Angehängte Dateien:

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.

von FZ (Gast)


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

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.