Alternative zu Application.DoEvents

  • VB.NET

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Alternative zu Application.DoEvents

    Hallo,

    ich dabei mein Projekt zu optimieren und möchte in diesem Zusammenhang die Verwendung von Application.DoEvents ersetzen.

    VB.NET-Quellcode

    1. 'Rotor Referenzpunkt suchen
    2. Private Sub Ref_init_Rotor()
    3. Do
    4. ACBPort.ACB_out = "C GAP 3,0" 'Ref-Punkt Rotor anfragen
    5. Motorantwort = ACBPort.ACB_in
    6. If Motorantwort.Length < 7 Then
    7. Motorantwort = "ERROR ROTOR"
    8. End If
    9. System.Threading.Thread.Sleep(500) 'Zeit Polling
    10. Application.DoEvents() '< Böse Funktion
    11. Loop Until Motorantwort.Substring(7, 1) = "0" Or _Rotor_init = False
    12. ACBPort.ACB_out = "C SAP 4,0,2047" 'Geschwindigkeit für Betrieb setzen
    13. ACBPort.ACB_out = "C SAP 204,0,200" 'Freeweeling - automatische Motorabschaltung
    14. End Sub


    Zur Erklärung:
    Mit ACBPort.ACB_out = "C GAP 3,0" wird ein Befehl über eine Serielle Schnittstelle gesendet und in Motorantwort ein Wert zurückgegeben.
    In der Do Loop Schleife gibt es dann zwei Abbruchbedingungen - Ref Punkt gefunden oder manueller Abbruch über _Rotor_init.

    Bedingung !!!

    Erst wenn der Ref Punkt gefunden wurde darf dass Proggy fortgesetzt werden - ist wie beim Rechner booten - erst wenn hochgefahren wurde kann ich was machen ;)
    Sendet die PC-Schnittstelle keine Events bei Datenempfang?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    DL3AD schrieb:

    Die Antworten müssen gepollt werden
    Was für eine Schnittstelle verwendest Du?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Kurze Frage:
    Mit welcher VB-Version bzw. mit welcher Framework-Version arbeitest du?
    Das könnte man nämlich super mit dem TAP zu asynchronen Code migrieren.

    Des Weiteren sollte man da mal einen Wrapper (In/Out-Stringparser + IO-Management) drum schreiben. Diese Rumhantieren mit Strings ist kein wirklich gutes Design.
    Von meinem iPhone gesendet

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „nikeee13“ ()

    @DL3AD::

    RodFromGermany schrieb:

    Was für eine Schnittstelle verwendest Du?
    Verwendest Du eine IO.Ports.SerialPort-Komponente?
    Du hast ein Problem, nicht wir.
    Es wäre also zumindest hilfreich für Dich, wenn Du unsere Fragen ordentlich beantworten würdest.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    DL3AD schrieb:

    wüßte nicht
    Und ein SerialPort stellt ein Event bereit, wenn Daten ankommen. Machma:

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. Me.Invoke(Sub() MessageBox.Show(SerialPort1.ReadExisting))
    3. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ... dass habe ich schon durch - folgendes Problem
    - es sind verschiedene Busteilnehmer mit unterschiedlichen Protokollen und somit auch unterschiedlichen Befehlslängen.
    - das Event kommt beim ersten Zeichen dass im Eingangsbuffer landet - somit muss ich eine Zeit warten bis alles im buffer ist.
    - die Motorantwort muss gepollt werden - da kommt nichts von alleine.

    ;( ?(

    DL3AD schrieb:

    aber dass löst ja nicht die eigentliche Frage die ich anfangs gestellt hatte.
    Du hast die Kennung von Deinem Gerät und hast diese nicht vollständig im Eröffnungspost dargelegt
    und
    Du hast eine vorgefertigte Meinung.
    Wir machen uns nun ein Bild von der Angelegenheit und müssen nun selbst erst mal versgtehen, was da los ist.
    Also:
    Beschreib mal bitte (praktisch) vollständig, was da los ist.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ich versuche es mal - hier die Klasse die den ComPort bereitstellt als mono Instanz

    VB.NET-Quellcode

    1. Imports System.IO.Ports
    2. Public Class ACB_Com
    3. Private _ACB_OK As Boolean
    4. Private _ACB_out As String
    5. Private _ACB_in As String
    6. Private ACB_Port As New SerialPort()
    7. ''' <summary>
    8. ''' Gibt an ob eine Verbindung mit dem ACB Bus hergestellt worden ist
    9. ''' </summary>
    10. Public Property ACB_OK As Boolean
    11. Get
    12. Return _ACB_OK
    13. End Get
    14. Set(value As Boolean)
    15. _ACB_OK = value
    16. End Set
    17. End Property
    18. ''' <summary>
    19. ''' Befehl auf den Bus senden
    20. ''' </summary>
    21. Public Property ACB_out As String
    22. Get
    23. Return _ACB_out
    24. End Get
    25. Set(value As String)
    26. _ACB_out = value
    27. ACB_write_read()
    28. End Set
    29. End Property
    30. ''' <summary>
    31. ''' Befehl vom Bus empfangen
    32. ''' </summary>
    33. Public Property ACB_in As String
    34. Get
    35. Return _ACB_in
    36. End Get
    37. Set(value As String)
    38. _ACB_in = value
    39. End Set
    40. End Property
    41. ''' <summary>
    42. ''' Verbindung mit dem ACB Bus herstellen
    43. ''' </summary>
    44. Public Sub ACB_init()
    45. For Each ComPort As String In SerialPort.GetPortNames
    46. Try
    47. ACB_Port.PortName = ComPort
    48. ACB_Port.BaudRate = 9600
    49. ACB_Port.DataBits = 8
    50. ACB_Port.Parity = Parity.None
    51. ACB_Port.StopBits = StopBits.One
    52. ACB_Port.NewLine = ControlChars.Cr
    53. ACB_Port.Open()
    54. ACB_Port.WriteLine("X00")
    55. System.Threading.Thread.Sleep(50)
    56. If ACB_Port.ReadExisting = "X00" & ControlChars.Cr Then
    57. _ACB_OK = True
    58. Exit For
    59. Else
    60. ACB_Port.Close()
    61. _ACB_OK = False
    62. End If
    63. Catch ex As Exception
    64. End Try
    65. Next
    66. End Sub
    67. 'Befehl auf ACB Bus senden und Antwort empfangen
    68. Private Sub ACB_write_read()
    69. If ACB_Port.IsOpen Then
    70. ACB_Port.WriteLine(_ACB_out)
    71. System.Threading.Thread.Sleep(50) 'Verzögerung Bustiming
    72. _ACB_in = ACB_Port.ReadExisting()
    73. End If
    74. End Sub
    75. ''' <summary>
    76. ''' ACB Bus schliessen
    77. ''' </summary>
    78. Public Sub ACB_close()
    79. If ACB_Port.IsOpen Then
    80. ACB_Port.Close()
    81. End If
    82. End Sub
    83. Private Shared _singleinstance As ACB_Com
    84. ' Parameterless Constructor is private, so not usable from the outside world
    85. Private Sub New()
    86. End Sub
    87. Public Shared Function CreateInstance() As ACB_Com
    88. If _singleinstance Is Nothing Then
    89. _singleinstance = New ACB_Com
    90. End If
    91. Return _singleinstance
    92. End Function
    93. End Class


    und hier die Klasse vom Rotor

    VB.NET-Quellcode

    1. Public Class Rotor
    2. Private ACBPort As ACB_Com = ACB_Com.CreateInstance
    3. Private _Rotor_soll_Pos As String = "0"
    4. Private _Rotor_ist_Pos As String = "0"
    5. Private _Rotor_init As Boolean
    6. Private Motorantwort As String
    7. ''' <summary>
    8. ''' Rotor Soll-Position vorgeben 0...180
    9. ''' </summary>
    10. Public Property Rotor_soll_Pos As String
    11. Get
    12. Return _Rotor_soll_Pos
    13. End Get
    14. Set(value As String)
    15. _Rotor_soll_Pos = value
    16. Turn_Rotor()
    17. End Set
    18. End Property
    19. ''' <summary>
    20. ''' Rotor Ist-Position ermitteln 0...180
    21. ''' </summary>
    22. Public Property Rotor_ist_Pos As String
    23. Get
    24. Pos_Rotor()
    25. Return _Rotor_ist_Pos
    26. End Get
    27. Set(value As String)
    28. _Rotor_ist_Pos = value
    29. End Set
    30. End Property
    31. ''' <summary>
    32. ''' Rotor Initialisierung oder Abbruch
    33. ''' </summary>
    34. Public Property Rotor_init As Boolean
    35. Get
    36. Return _Rotor_init
    37. End Get
    38. Set(value As Boolean)
    39. _Rotor_init = value
    40. Ref_init_Rotor()
    41. End Set
    42. End Property
    43. 'Rotor Referenzpunkt suchen
    44. Private Sub Ref_init_Rotor()
    45. Do
    46. ACBPort.ACB_out = "C GAP 3,0" 'Warten auf Ref-Punkt Rotor
    47. Motorantwort = ACBPort.ACB_in
    48. If Motorantwort.Length < 7 Then
    49. Motorantwort = "0000000000"
    50. End If
    51. System.Threading.Thread.Sleep(100)
    52. Loop Until Motorantwort.Substring(7, 1) = "0" Or _Rotor_init = False
    53. ACBPort.ACB_out = "C SAP 4,0,2047" 'Geschwindigkeit für Betrieb setzen
    54. ACBPort.ACB_out = "C SAP 204,0,200" 'Freeweeling - automatische Motorabschaltung
    55. End Sub
    56. 'Rotor auf Position fahren 0...180°
    57. Private Sub Turn_Rotor()
    58. ACBPort.ACB_out = "C MVP ABS,0," & Convert.ToString(Convert.ToInt32(_Rotor_soll_Pos) * 6667)
    59. End Sub
    60. 'Rotor Position ermitteln 0...180°
    61. Private Sub Pos_Rotor()
    62. ACBPort.ACB_out = "C GAP 1,0"
    63. Motorantwort = ACBPort.ACB_in
    64. If Motorantwort.Length < 8 Then
    65. Motorantwort = "0000000000"
    66. End If
    67. If Motorantwort.Substring(0, 2) = "DC" Then
    68. _Rotor_ist_Pos = Convert.ToString(Convert.ToInt32(Convert.ToInt32(Motorantwort.Remove(0, 7)) / 6667))
    69. End If
    70. End Sub
    71. End Class


    hier die Hauptform

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents Rotor_soll_Timer As New System.Windows.Forms.Timer()
    3. Private WithEvents Rotor_ist_Timer As New System.Windows.Forms.Timer()
    4. Private RX_Rotor As New Rotor
    5. Private TX_ATU As New ATU
    6. Private Out_Box As New OutBox
    7. Private In_Box As New InBox
    8. Private ACBPort As ACB_Com = ACB_Com.CreateInstance
    9. Private SetupPath As String = "Setup.xml"
    10. Private MemNr As Integer = 0
    11. Private Ist_Pos As String
    12. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    13. Me.DataSet_ACB.ReadXml(SetupPath)
    14. 'Verbindung zum ACB Bus herstellen
    15. ACBPort.ACB_init()
    16. If ACBPort.ACB_OK = False Then
    17. MessageBox.Show("ACB nicht gefunden")
    18. Me.Close()
    19. End If
    20. End Sub
    21. 'Form Init Rotor und Init ATU öffnen
    22. Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
    23. Form2_init.Show()
    24. End Sub
    25. 'Haupt form schliessen
    26. Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
    27. ACBPort.ACB_close()
    28. End Sub
    29. 'Setup Tabellen aufrufen
    30. Private Sub Button_Setup_Click(sender As Object, e As EventArgs) Handles Button_Setup.Click
    31. Form3_setup.Show()
    32. End Sub
    33. 'Rotor Position vorgeben
    34. Private Sub TrackBar1_ValueChanged(sender As Object, e As EventArgs) Handles TrackBar_Rotor.ValueChanged
    35. Label_Rotor_soll_pos.Text = Convert.ToString(TrackBar_Rotor.Value * 5) & "°"
    36. Rotor_soll_Timer.Stop()
    37. Rotor_soll_Timer.Interval = 500
    38. Rotor_soll_Timer.Start()
    39. End Sub
    40. 'Eventtimer Rotor soll Position sendet erst einen Wert an den Rotor wenn 50ms keine Wertforgabe mehr erfolgte
    41. Private Sub Rotor_soll_Timer_Tick(sender As System.Object, e As System.EventArgs) Handles Rotor_soll_Timer.Tick
    42. Rotor_soll_Timer.Stop()
    43. RX_Rotor.Rotor_soll_Pos = Convert.ToString(TrackBar_Rotor.Value * 5)
    44. Rotor_ist_Timer.Interval = 500
    45. Rotor_ist_Timer.Start()
    46. End Sub
    47. 'Eventtimer Rotor ist Position - läuft solange bis die Soll-Pos des Rotor erreicht worden ist
    48. Private Sub Rotor_ist_Timer_Tick(sender As System.Object, e As System.EventArgs) Handles Rotor_ist_Timer.Tick
    49. Ist_Pos = RX_Rotor.Rotor_ist_Pos
    50. If Convert.ToString(TrackBar_Rotor.Value * 5) = Ist_Pos Then
    51. Rotor_ist_Timer.Stop()
    52. End If
    53. Label_ist_Pos.Text = Ist_Pos & "°"
    54. ProgressBar_Rotor.Value = Convert.ToInt32(Ist_Pos)
    55. End Sub
    56. 'RX Antenne 1 schalten
    57. Private Sub RadioButton_RX_Ant1_Click(sender As Object, e As EventArgs) Handles RadioButton_RX_Ant1.Click
    58. In_Box.Ant_Pwr = "0"
    59. Out_Box.RX_Ant = "0"
    60. In_Box.Ant_Pwr = DataSet_ACB.Tbl_AntPWR.FindByAntNr(1).PWR
    61. If DataSet_ACB.Tbl_AntPWR.FindByAntNr(1).PWR = "1" Then
    62. RadioButton_PWR.Checked = True
    63. Else
    64. RadioButton_PWR.Checked = False
    65. End If
    66. End Sub
    67. 'RX Antenne 2 schalten
    68. Private Sub RadioButton_RX_Ant2_Click(sender As Object, e As EventArgs) Handles RadioButton_RX_Ant2.Click
    69. In_Box.Ant_Pwr = "0"
    70. Out_Box.RX_Ant = "1"
    71. In_Box.Ant_Pwr = DataSet_ACB.Tbl_AntPWR.FindByAntNr(2).PWR
    72. If DataSet_ACB.Tbl_AntPWR.FindByAntNr(2).PWR = "1" Then
    73. RadioButton_PWR.Checked = True
    74. Else
    75. RadioButton_PWR.Checked = False
    76. End If
    77. End Sub
    78. 'Tiefpassfilter schalten
    79. Private Sub RadioButton_TP_Click(sender As Object, e As EventArgs) Handles RadioButton_TP.Click
    80. In_Box.Filter = "1"
    81. End Sub
    82. 'Hochpassfilter schalten
    83. Private Sub RadioButton_HP_Click(sender As Object, e As EventArgs) Handles RadioButton_HP.Click
    84. In_Box.Filter = "0"
    85. End Sub
    86. 'Empfänger 1 schalten
    87. Private Sub RadioButton_RX1_Click(sender As Object, e As EventArgs) Handles RadioButton_RX1.Click
    88. In_Box.RX = "0"
    89. End Sub
    90. 'Empfänger 2 schalten
    91. Private Sub RadioButton_RX2_Click(sender As Object, e As EventArgs) Handles RadioButton_RX2.Click
    92. In_Box.RX = "1"
    93. End Sub
    94. 'RX Antenne 2 Richtung N
    95. Private Sub RadioButton_N_Click(sender As Object, e As EventArgs) Handles RadioButton_N.Click
    96. Out_Box.Ant2_Controll = "0"
    97. End Sub
    98. 'RX Antenne 2 Richtung O
    99. Private Sub RadioButton_O_Click(sender As Object, e As EventArgs) Handles RadioButton_O.Click
    100. Out_Box.Ant2_Controll = "1"
    101. End Sub
    102. 'RX Antenne 2 Richtung S
    103. Private Sub RadioButton_S_Click(sender As Object, e As EventArgs) Handles RadioButton_S.Click
    104. Out_Box.Ant2_Controll = "2"
    105. End Sub
    106. 'RX Antenne 2 Richtung W
    107. Private Sub RadioButton_W_Click(sender As Object, e As EventArgs) Handles RadioButton_W.Click
    108. Out_Box.Ant2_Controll = "3"
    109. End Sub
    110. 'ATU Tuning 160m
    111. Private Sub RadioButton_160m_Click(sender As Object, e As EventArgs) Handles RadioButton_160m.Click
    112. MemNr = MemNr + 1
    113. If MemNr > 10 Then
    114. MemNr = 1
    115. End If
    116. Tuning_values()
    117. End Sub
    118. 'ATU Tuning 80m
    119. Private Sub RadioButton_80m_Click(sender As Object, e As EventArgs) Handles RadioButton_80m.Click
    120. MemNr = 11
    121. Tuning_values()
    122. End Sub
    123. 'ATU Tuning 40m
    124. Private Sub RadioButton_40m_Click(sender As Object, e As EventArgs) Handles RadioButton_40m.Click
    125. MemNr = 12
    126. Tuning_values()
    127. End Sub
    128. 'ATU Tuning 30m
    129. Private Sub RadioButton_30m_Click(sender As Object, e As EventArgs) Handles RadioButton_30m.Click
    130. MemNr = 13
    131. Tuning_values()
    132. End Sub
    133. 'Umschaltung auf Beam
    134. Private Sub RadioButton_Beam_Click(sender As Object, e As EventArgs) Handles RadioButton_Beam.Click
    135. MemNr = 14
    136. Tuning_values()
    137. End Sub
    138. 'Handeinstellung L Wert
    139. Private Sub NumericUpDown_Lwert_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown_Lwert.ValueChanged
    140. TX_ATU.L_Wert = NumericUpDown_Lwert.Value.ToString
    141. End Sub
    142. 'Handeinstellung C Wert
    143. Private Sub NumericUpDown_Cwert_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown_Cwert.ValueChanged
    144. TX_ATU.C_Wert = NumericUpDown_Cwert.Value.ToString
    145. End Sub
    146. 'Tuningwerte abrufen und tunen
    147. Private Sub Tuning_values()
    148. 'Anzeige L-Wert aktualisieren
    149. RemoveHandler NumericUpDown_Lwert.ValueChanged, AddressOf NumericUpDown_Lwert_ValueChanged
    150. NumericUpDown_Lwert.Value = Convert.ToDecimal(DataSet_ACB.Tbl_ATU.FindByTUN_Nr(MemNr).L_Wert)
    151. AddHandler NumericUpDown_Lwert.ValueChanged, AddressOf NumericUpDown_Lwert_ValueChanged
    152. 'Anzeige C-Wert aktualisieren
    153. RemoveHandler NumericUpDown_Cwert.ValueChanged, AddressOf NumericUpDown_Cwert_ValueChanged
    154. NumericUpDown_Cwert.Value = Convert.ToDecimal(DataSet_ACB.Tbl_ATU.FindByTUN_Nr(MemNr).C_Wert)
    155. AddHandler NumericUpDown_Cwert.ValueChanged, AddressOf NumericUpDown_Cwert_ValueChanged
    156. 'Tuning ausführen
    157. TX_ATU.C_Wert = DataSet_ACB.Tbl_ATU.FindByTUN_Nr(MemNr).C_Wert
    158. TX_ATU.C_Low = DataSet_ACB.Tbl_ATU.FindByTUN_Nr(MemNr).C_low
    159. TX_ATU.L_Wert = DataSet_ACB.Tbl_ATU.FindByTUN_Nr(MemNr).L_Wert
    160. Out_Box.TX_Ant = DataSet_ACB.Tbl_ATU.FindByTUN_Nr(MemNr).TX_Ant2
    161. Label_TunInfo.Text = DataSet_ACB.Tbl_ATU.FindByTUN_Nr(MemNr).QRG & " " & DataSet_ACB.Tbl_ATU.FindByTUN_Nr(MemNr).Antenne
    162. End Sub
    163. 'Default Einstellung RX Ant PWR setzen
    164. Private Sub Form1_EnabledChanged(sender As Object, e As EventArgs) Handles MyBase.EnabledChanged
    165. If Me.Enabled Then
    166. In_Box.Ant_Pwr = DataSet_ACB.Tbl_AntPWR.FindByAntNr(1).PWR
    167. If DataSet_ACB.Tbl_AntPWR.FindByAntNr(1).PWR = "1" Then
    168. RadioButton_PWR.Checked = True
    169. Else
    170. RadioButton_PWR.Checked = False
    171. End If
    172. End If
    173. End Sub
    174. End Class


    in dieser Form wird der initialisierungsprozess aufgerufen

    VB.NET-Quellcode

    1. Public Class Form2_init
    2. Private RX_Rotor As New Rotor
    3. Private TX_ATU As New ATU
    4. Private Out_Box As New OutBox
    5. Private In_Box As New InBox
    6. Dim ACBPort As ACB_Com = ACB_Com.CreateInstance
    7. 'Statusmeldungen Rotor und ATU ausgeben
    8. Private Sub Form2_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    9. Label_Rotor_init.Text = "Rotor ref init"
    10. RX_Rotor.Rotor_init = True
    11. Label_Rotor_init.Text = "Rotor ready"
    12. Label_ATU_init.Text = "ATU ref init"
    13. TX_ATU.ATU_init = True
    14. Label_ATU_init.Text = "ATU ready"
    15. Me.Close()
    16. Form1.Enabled = True
    17. End Sub
    18. 'Initialisierung abbrechen
    19. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    20. Label_Rotor_init.Text = "Rotor is not ready"
    21. Label_ATU_init.Text = "ATU is not ready"
    22. RX_Rotor.Rotor_init = False
    23. TX_ATU.ATU_init = False
    24. Form1.Close()
    25. End Sub
    26. End Class


    Dann gibt es noch eine weitere Form wo Tabellen mit einstellwerten verwaltet werden.
    Weitere Klassen sind dann noch
    - ATU - Tunersteuerung
    - InBox Controller zum umschalten
    - OutBox Controller zum umschalten

    Folgende Bussteilnehmer sin derzeitig am Bus
    - zwei Schrittmotoren von der Fa trimatic - kommerzielles Produkt
    - drei µController eigenbau

    in kürze kommen hinzu
    - Richtantennencontroller von SteppIR
    - Rotorsteuergerät von Yaesu
    - Tranceiver Elecraft K3

    - alle Busteilnehmer haben ein Protokoll aud ASCII Basis
    - alle Busteilnehmer müssen abgefragt werden
    - alle Busteilnehmer haben ein anderes Abschlusszeichen im Befehlssatz
    - Befehe und deren Antworten haben unterschiedliche Längen

    Die Busteilnehmer müssen nach dem FIFO Prinzip behandet werden.
    Die Hardware des Busses basiert auf RS485 simplex 9600bps

    Ich hoffe dass reicht erstmal an Infos :)

    DL3AD schrieb:

    hier die Klasse die den ComPort bereitstellt
    und Dein anderer Code noch.

    VB.NET-Quellcode

    1. Imports System.IO.Ports
    2. Public Class ACB_Com
    3. Private WithEvents ACB_Port As SerialPort
    4. Public Sub New()
    5. ACB_Port = New SerialPort
    6. End Sub
    7. Private Sub xxx(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles ACB_Port.DataReceived
    8. MessageBox.Show(Me.ACB_Port.ReadExisting)
    9. End Sub
    10. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ... dass mit dem DataReceivedEvent habe ich schon probiert - da kommen nur Bruchstücke der Antwort zurück - da muss ich 50ms warten (nichts tun).
    hier noch der Code vom ATU Antennen Tuner der muss auch initialisiert werden.

    VB.NET-Quellcode

    1. Public Class ATU
    2. Dim ACBPort As ACB_Com = ACB_Com.CreateInstance
    3. Private _ATU_init As Boolean
    4. Private _C_Wert As String = "0"
    5. Private _L_Wert As String = "0"
    6. Private _C_Low As String = "0"
    7. Private _LWert As Double
    8. Private Motorantwort As String
    9. ''' <summary>
    10. ''' ATU Initialisierung oder Abbruch
    11. ''' </summary>
    12. Public Property ATU_init As Boolean
    13. Get
    14. Return _ATU_init
    15. End Get
    16. Set(value As Boolean)
    17. _ATU_init = value
    18. Ref_init_ATU()
    19. End Set
    20. End Property
    21. ''' <summary>
    22. ''' ATU Einstellwert Drehkondensator vorgeben, Kapazitaet 15...430 pF
    23. ''' </summary>
    24. Public Property C_Wert As String
    25. Get
    26. Return _C_Wert
    27. End Get
    28. Set(value As String)
    29. _C_Wert = value
    30. Tune_C()
    31. End Set
    32. End Property
    33. ''' <summary>
    34. ''' ATU Einstellwert C-Low /
    35. ''' 0 = OFF /
    36. ''' 1 = ON /
    37. ''' C-Low vor L-Wert setzen !
    38. ''' </summary>
    39. Public Property C_Low As String
    40. Get
    41. Return _C_Low
    42. End Get
    43. Set(value As String)
    44. _C_Low = value
    45. End Set
    46. End Property
    47. ''' <summary>
    48. ''' ATU Einstellwert L-Bank vorgeben 0,0...25,4µH
    49. ''' </summary>
    50. Public Property L_Wert As String
    51. Get
    52. Return _L_Wert
    53. End Get
    54. Set(value As String)
    55. _L_Wert = value
    56. Tune_L()
    57. End Set
    58. End Property
    59. 'ATU Referenzpunkt suchen
    60. Private Sub Ref_init_ATU()
    61. Do
    62. ACBPort.ACB_out = "A GAP 3,0" 'Warten auf Ref-Punkt Rotor
    63. Motorantwort = ACBPort.ACB_in
    64. If Motorantwort.Length < 7 Then
    65. Motorantwort = "ERROR ATU"
    66. End If
    67. System.Threading.Thread.Sleep(100)
    68. Loop Until Motorantwort.Substring(7, 1) = "0" Or _ATU_init = False
    69. ACBPort.ACB_out = "A SAP 204,0,200" 'Freeweeling - automatische Motorabschaltung
    70. End Sub
    71. 'Drehkondensator abstimmen
    72. Private Sub Tune_C()
    73. _C_Wert = Convert.ToString(Math.Round((Convert.ToDouble(_C_Wert) - 15) * 51.83))
    74. ACBPort.ACB_out = "A MVP ABS,0," & _C_Wert
    75. End Sub
    76. 'L-Bank abstimmen
    77. Private Sub Tune_L()
    78. _L_Wert = _L_Wert.Replace(",", "") 'entspricht Multiplikation * 10
    79. If _C_Low = "1" Then
    80. _L_Wert = Convert.ToString(Convert.ToInt32(_L_Wert) \ 2 + 128)
    81. Else
    82. _L_Wert = Convert.ToString(Convert.ToInt32(_L_Wert) \ 2)
    83. End If
    84. ACBPort.ACB_out = "L" & _L_Wert
    85. End Sub
    86. End Class