none
Bräuchte Hilfe wegen übergabe eines Strings von einem Thread in den Anderen RRS feed

  • Frage

  • Nachdem ich mich nun etwas mit Delegates und Threads befasst habe, habe ich nun folgenden Code. Leider kommt in der Zeile "YYY.INVOKE(SerIn)" immer eine Null-Verweis Fehlermeldung. Warum, kann ich mir nicht erklären.

    Public Class MLTRS232
    
     Public Shared Vrs As String = "V0.0.1"                    'Globale Versionsnummer
     Public Shared PrgTeil As String = "MLT-RS232 Steuerung"            'Globaler Programmteilname
     Public Shared Datum As String = "28.09.2010"                 'Änderungs-/Erstelldatum
    
     Public Shared ByteIn() As Byte
     Private Shared SerIn As String
    
     Private Shared WithEvents Serial As New IO.Ports.SerialPort          'Seriellen Port instanzieren
    
     Private Delegate Sub Data(ByVal XXX As String)                'Delegate einrichten
     Dim d As New Data(AddressOf Empf)                       
     Private Shared YYY As Data
       
     Public Shared Sub Send()
    
       With Serial                                 'Eigenschaften RS232 festlegen.
       .PortName = "COM1"                            'Portname
       .Handshake = IO.Ports.Handshake.None                   'Kein handshaking
       .BaudRate = 9600                             'Baudrate
       .Parity =IO.Ports.Parity.None                       'Ohne Parity
       .DataBits = 8                               '8 Datenbits
       .StopBits =IO.Ports.StopBits.One                     'ein Stoppbit
       .RtsEnable = True                             'RTS-Aktivieren
       .DtrEnable = True                             'DTR-Aktivieren
      End With
    
      Serial.Open()                                'Port öffnen
    
      'Zum Testen des Sendens Befehl für die Befehlsübersicht zum MLT senden.
    
      Serial.Write(Chr(&H14))                           'Befehl $14 zum MLT senden.
     
     End Sub
    
     Private Shared Sub Empf(ByVal DD As String)
    
      ReDim ByteIn(DD.Length - 1)
      For A As Integer = 0 To DD.Length - 1
       ByteIn(A) = Asc(DD.Substring(A, 1))
      Next
    
     End Sub
    
     '******************************************************************************
     '* Ereignishandler für die RS-232 Schnittstelle. Dieser wird in einem separa- *
     '* ten Tread ausgeführt!!                           *
     '****************************************************************************** 
    
     Private Shared Sub Serial_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles Serial.DataReceived
      
      SerIn = Serial.ReadExisting
    
      YYY.Invoke(SerIn)
      
     End Sub
    
    End Class
    
    wo liegt denn das Problem??
    Gelegentlicher Programmierer für Freizeitprojekte
    Montag, 4. Oktober 2010 20:35

Antworten

  • Hallo Roger,

    Nachdem ich mich nun etwas mit Delegates und Threads befasst
    habe, habe ich nun folgenden Code. Leider kommt in der Zeile
    "YYY.INVOKE(SerIn)" immer eine Null-Verweis Fehlermeldung.
    Warum, kann ich mir nicht erklären.

    Weil Du zwar eine Variable mit

        Private Shared YYY as Data

    deklariert hast, dieser Variablen jedoch nirgendwo eine
    Instanz irgendeines Objektes zugewiesen hast.

    Offenbar hast Du die Antworten auf Deine Frage(n) in
    http://social.msdn.microsoft.com/Forums/de-DE/vbasicexpresseditionde/thread/91571ea8-a0cf-499b-b37f-3bc0c686a3c1
    entweder nicht gelesen oder immer noch nicht verstanden.

    In Deinem hier gezeigten Code gibt es mehr als ein Problem.

    Private Delegate Sub Data(ByVal XXX As String)    'Delegate einrichten
    Dim d As New Data(AddressOf Empf)

    Hier hast Du einen neuen Delegaten (Instanz) erstellt
    und der Variablen d zugewiesen.

    Private Shared YYY As Data

    Mit vorstehender Zeile hast Du eine weitere Variable
    (YYY) vom Typ Data deklariert, welcher Du aber nirgendwo
    etwas zuweist, also nirgendwo eine Befehlszeile wie z.B.
    die nachfolgende ausgeführt wird.

        YYY = New Data(AddressOf Empf)


    Private Shared Sub Serial_DataReceived _

    >        (ByVal sender As Object, _

             ByVal e As System.IO.Ports.SerialDataReceivedEventArgs _
            ) Handles Serial.DataReceived

        SerIn = Serial.ReadExisting
        YYY.Invoke(SerIn)

        YYY hat in vorstehender Zeile bei Deinem Code den
        Wert Nothing.
        Wenn schon, dann könntest Du

            d.Invoke(SerIn)

        schreiben.
        Bleibt aber die Frage, was Du damit erreichen willst.

    End Sub

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Dienstag, 5. Oktober 2010 07:49

Alle Antworten

  • Hallo Roger

     

    In Deinem Code sehe ich, dass Du die Variable YYY dimensionierst, ihr jedoch keinen Wert zuweist.

    Private Shared YYY As Data = New ...
    
    

    oder

    Private Shared YYY As Data
    
    YYY = ...
    

    Montag, 4. Oktober 2010 22:30
  • Hallo Roger,

    Nachdem ich mich nun etwas mit Delegates und Threads befasst
    habe, habe ich nun folgenden Code. Leider kommt in der Zeile
    "YYY.INVOKE(SerIn)" immer eine Null-Verweis Fehlermeldung.
    Warum, kann ich mir nicht erklären.

    Weil Du zwar eine Variable mit

        Private Shared YYY as Data

    deklariert hast, dieser Variablen jedoch nirgendwo eine
    Instanz irgendeines Objektes zugewiesen hast.

    Offenbar hast Du die Antworten auf Deine Frage(n) in
    http://social.msdn.microsoft.com/Forums/de-DE/vbasicexpresseditionde/thread/91571ea8-a0cf-499b-b37f-3bc0c686a3c1
    entweder nicht gelesen oder immer noch nicht verstanden.

    In Deinem hier gezeigten Code gibt es mehr als ein Problem.

    Private Delegate Sub Data(ByVal XXX As String)    'Delegate einrichten
    Dim d As New Data(AddressOf Empf)

    Hier hast Du einen neuen Delegaten (Instanz) erstellt
    und der Variablen d zugewiesen.

    Private Shared YYY As Data

    Mit vorstehender Zeile hast Du eine weitere Variable
    (YYY) vom Typ Data deklariert, welcher Du aber nirgendwo
    etwas zuweist, also nirgendwo eine Befehlszeile wie z.B.
    die nachfolgende ausgeführt wird.

        YYY = New Data(AddressOf Empf)


    Private Shared Sub Serial_DataReceived _

    >        (ByVal sender As Object, _

             ByVal e As System.IO.Ports.SerialDataReceivedEventArgs _
            ) Handles Serial.DataReceived

        SerIn = Serial.ReadExisting
        YYY.Invoke(SerIn)

        YYY hat in vorstehender Zeile bei Deinem Code den
        Wert Nothing.
        Wenn schon, dann könntest Du

            d.Invoke(SerIn)

        schreiben.
        Bleibt aber die Frage, was Du damit erreichen willst.

    End Sub

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Dienstag, 5. Oktober 2010 07:49