mehrere VirtualCOM Adapter

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Gerd_F.

    mehrere VirtualCOM Adapter

    Hallo liebes Forum,
    ich schlage mich seit mehreren Tagen mit folgendenm Problem herum:
    in Me.Shown werden nacheinander insgesamt 6 serielle Schnittstellen abgefragt, jeweils in getrennten Subs. Die letzte Schnittstelle muss ein binäres Protokoll senden (16 Bytes). Dieses Write wird einfach übersprungen (jedenfalls stellt es sich so dar.
    Die Prozedur für die Aufrufe:

    VB.NET-Quellcode

    1. Private Sub frmBohle_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    2. With frmMain.ProgressBar
    3. .Visible = True
    4. Check_for_Pads() 'überprüft, ob Pad 1-3 angeschlossen ist
    5. .Value = 66
    6. Check_for_Relais() 'ermittelt den Port des USB-Relais
    7. .Value = 83
    8. Check_for_Board() 'überprüft, ob ein Jury-board angeschlossen ist
    9. .Value = 95
    10. COM_Init()
    11. .Value = 100
    12. uPorts.Clear()
    13. .Visible = False
    14. End With
    15. Try
    16. frmMain.Cursor = Cursors.Default
    17. Catch ex As Exception
    18. End Try
    19. End Sub


    "Check_for_Pads" und "Check_for_Relais" klappt einwandfrei. Aber bei der nächsten wird die Funktion "WriteBuffer" nicht ausgeführt.

    VB.NET-Quellcode

    1. Private Sub Check_for_Board()
    2. Dim ports As String() = SerialPort.GetPortNames()
    3. Dim NoBoard As Boolean
    4. Dim myPort As New SerialPort
    5. With myPort
    6. For c As Integer = 0 To ports.Count - 1
    7. If Not uPorts.ContainsKey(ports(c)) Then
    8. NoBoard = False
    9. ReDim buf(15)
    10. Try
    11. If .IsOpen Then .Close()
    12. .PortName = ports(c)
    13. .BaudRate = 9600
    14. .Parity = Parity.None
    15. .DataBits = 8
    16. .StopBits = StopBits.One
    17. .Handshake = Handshake.None
    18. .ParityReplace = 63
    19. .ReceivedBytesThreshold = 1
    20. .ReadTimeout = 500
    21. .RtsEnable = False
    22. .WriteTimeout = 500
    23. .ReadBufferSize = 4096
    24. .WriteBufferSize = 2048
    25. .Open()
    26. Catch ex As Exception
    27. NoBoard = True
    28. End Try
    29. If Not NoBoard Then
    30. Try
    31. If WriteBuffer(myPort, buf) Then
    32. Dim ch() As Char = myPort.ReadExisting().ToCharArray
    33. For i = LBound(ch) To UBound(ch)
    34. Select Case ch(i)
    35. Case CChar("F")
    36. With BoardPort
    37. If .IsOpen Then .Close()
    38. .PortName = ports(c)
    39. .BaudRate = 9600
    40. .Parity = Parity.None
    41. .DataBits = 8
    42. .StopBits = StopBits.One
    43. .Handshake = Handshake.None
    44. .ParityReplace = 63
    45. .ReceivedBytesThreshold = 1
    46. .ReadTimeout = 500
    47. .RtsEnable = False
    48. .WriteTimeout = 500
    49. .ReadBufferSize = 4096
    50. .WriteBufferSize = 2048
    51. End With
    52. uPorts.Add(ports(c), 500)
    53. Exit For
    54. End Select
    55. Next
    56. Else
    57. NoBoard = True
    58. End If
    59. Catch ex As Exception
    60. NoBoard = True
    61. End Try
    62. End If
    63. End If
    64. Next
    65. .Dispose()
    66. End With
    67. End Sub


    Die Funktion WriteBuffer

    VB.NET-Quellcode

    1. Private Function WriteBuffer(port As SerialPort, buf() As Byte) As Boolean
    2. Dim success As Boolean = True
    3. Dim CRC As Long = 65535 'Anfangswert für die CRC laden
    4. For x As Integer = 0 To 12 'CRC geht über alle 12 Datenbytes
    5. CRC = CRC Xor buf(CInt(x)) 'Aktuelles Datenbyte in die CRC-einbeziehen
    6. For y As Integer = 1 To 8 'Acht Runden schieben und XOR-en
    7. If (CRC Mod 2) > 0 Then
    8. CRC = CLng((CRC And 65534) / 2)
    9. CRC = CRC Xor 40961 'Polynom der CRC 0xA001 in dezimal ausgedrückt
    10. Else
    11. CRC = CLng((CRC And 65534) / 2)
    12. End If
    13. Next
    14. Next
    15. 'Die beiden CRC-Bytes werden an die Nachricht angehängt
    16. buf(13) = CByte((CRC And 65280) / 256)
    17. buf(14) = CByte(CRC And 255)
    18. Try
    19. Threading.Thread.Sleep(100)
    20. port.Write(buf, 0, 15) 'Gesamtes Paket absenden
    21. Catch ex As Exception
    22. success = False
    23. End Try
    24. Return success
    25. End Function


    Ich bin echt am Verzweifeln. Kann mi irgendjemand sagen, warum beim Durchsteppen alles klappt, wenn ich einen Breakpoint vor den Write-Befehl setze alles klappt --- nur beim normalen Ablauf wird dem BoardPort nichts zugewiesen???
    Bin für jede Hilfe dankbar!

    Gerd_F schrieb:

    in Me.Shown werden nacheinander insgesamt 6 serielle Schnittstellen abgefragt
    Habe ich Dich richtig verstanden:
    Du bestellst bei 6 verschiedenen Pizzaserices 6 Essen und rennst an die Tür, um um den Pizza-Service 1 abzuholen, dann um den Service 2, dann 3, dann 4 usw. zu bedienen???
    Wenn ich was bestelle, warte ich, bis ein Service bei mir klingelt.
    Wenn es dann 6 Mal geklingelt hat, waren alle da.
    Ein SerialPort hat ein DataReceived-Event. Nutze dies, um seine Antwort auszuwerten.
    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!
    Die 4 ersten Serialport werden so abgefragt: ID = CByte(myPort.ReadByte - 97). Sie geben die IDs 1-4 zurück. das funktioniert. Der 5. funktioniert auch über eine vom Hersteller mitgelieferte DLL (Conrad Relaisboard). Nur beim 6. funktioniert das in Check_for_Board nicht. Das Programm scheint Write zu ignorieren.

    Wenn ich die Antwort im DataReceived-Event auswerten will, scheint das Programm diesen Event zu überspringen. Wenn ich bei der erwarteten Antwort einen Breakpoint setze oder Stopp einfüge, geht das Programm dorthin - allerdings unendlich oft und der Breakpoint hat einen grünen Punkt =>DerProzess oder Thread wurde seit dem letzten Aufruf geändert. Leider kann ich damit nichts anfangen. Wie bekomme ich heraus, wo da was geändert wurde?

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Gerd_F“ ()

    Gerd_F schrieb:

    Wie bekomme ich heraus
    Mach im DataReceived-Event eine Debug-Ausgabe:

    VB.NET-Quellcode

    1. Console.WriteLine(SerialPort6.ReadExisting())

    -----
    Möglicherweise ist das Port schlecht parametriert.
    Gugst Du SerialPort.NewLine in Verbindung mit SerialPort.ReadLine und SerialPort.WriteLine.
    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!

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

    Danke für die Denkanstöße. Hab den Fehler gefunden. Die Firmware des Controllers ist falsch geschrieben. Dort ist ein TimeOut von 5 Sekunden programmiert anstatt 0,5 Sekunden. Das Programm hat nicht das Ereignis übersprungen, sondern weniger als die (falschen) 5 Sekunden gebraucht und daher nichts gemacht. Deshalb ging es auch mit einem Breakpoint oder Stopp - sobald ich länger als 5 Sekunden gewartet habe.