Verbindung mit Microcontroller

  • VB6

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Mad Andy.

    Verbindung mit Microcontroller

    Hallo Leute
    Ich habe da folgende Problemstellung, mit der ich nicht wirklich weiterkomme:
    Es geht darum ein Gerät mit einem Microcontroller per VB auszulesen und die Daten dann darzustellen.
    In diesem Fall muss das Programm erst einen Befehl zum Microcontroller senden (in meinem Fall "E0")
    Daraufhin sendet der Microcontroller ein komplettes Datenfeld, welches aus 26 Bytes besteht (25 plus Prüfsumme)
    Diese Daten möchte ich dann (erstmal) nur als Zahlenwerte darstellen
    Die ganze Kommunikation findet Seriell mit 38400,8,N,1 statt.

    Es wäre klasse, wenn mit jemand dabei auf den richtigen Weg helfen würde, bzw. ein grundsätzliches Beispiel für mich hat.
    Gruß

    Volker
    Ich glaube, mein Hauptproblem liegt schon bei der grundsätzlichen Vorgehensweise.
    Wenn ich unter Bascom (Basic für Atmel Micro Controller) eine Abfrage für die serielle Schnittstelle schreibe mache ich es im Prinzip so:
    Die Schnittstelle wird geöffnet, das empfangene Byte wird in ein Array geschrieben und dann "durchgeschoben". Dieses passiert solange,
    bis ich z.B. das Start Signal oder ein eventuelles Synchronsignal an einer bestimmten Stelle im Array durch eine If Abfrage erkenne.
    Nur leider scheint dieses Vorgehen mit VB6 so nicht zu funktionieren.
    Daher suche ich nun ein Beispiel, wie man soetwas ab einfachsten unter VB6 erledigen könnte.
    Gruß
    Volker
    Hi!

    Unter VB6 nimmt man das MSComm-Steuerelement. Wenn du die eingebaute Hilfe (MSDN) hast, dann sollte das schon als Nachschlagewerk reichen, ansonsten einfach mal Googlen.

    Das Konfigurieren machst du am Besten nicht über die Properties, sondern im Programm selbst, beim Form_Load Ereignis oder einem Connect-/Start-Button z.B., damit du ohne großen aufwand die Parameter wählbar machen kannst, falls das mal nötig ist

    Visual Basic-Quellcode

    1. MSComm1.CommPort = 1 ' Port Nr.
    2. MSComm1.Settings = "38400,n,8,1" ' 38400 Baud, keine Parity, 8 Bits, 1 Stoppbit
    3. MSComm1.PortOpen = True ' Port öfnnen


    Über MSComm1.Output(String) kannst du rausschreiben. Das Empfangen geht mit einem Event. Genaueres dazu, wie gesagt, im WWW oder in der MSDN.

    Beim Beenden (Form_Unload) machst du dann am Besten auch noch

    Visual Basic-Quellcode

    1. MSComm1.PortOpen = False
    um den Port wieder freizugeben.

    mfG
    Andy

    Edit:
    Auf'n Max232 hast du eh nicht vergessen, oder? Ich frag nur sicherheitshalber nach, weil die +/-12V einem µC nich so wirklich gefallen wollen :D
    Hallo Andy

    Mad Andy schrieb:


    Über MSComm1.Output(String) kannst du rausschreiben. Das Empfangen geht mit einem Event. Genaueres dazu, wie gesagt, im WWW oder in der MSDN.

    Den Comport bekomme ich ja geöffnet (Bluetooth Comport), und auch die Daten fliessen.
    Das Problem ist der Empfang mit dem Event, da der Microcontrolle auch ohne einen Befehl vom PC ständig Daten sendet (Betriebsmodus). Sobald vom PC ein Befehl kommt, schaltet der Microcontroller in den Prog-Modus und beantwortet den empfangenen Befehl entsprechend. Nach 4 Sekunden geht er dann wieder automatisch in den normalen Betriebsmodus und sendet wieder ständig Daten.
    Das bedeutet aber, dass ja ständig ein "Event" anliegt.
    Und dummerweise kann ich direkt nach dem Empfang der Daten die Schnittstelle ja nicht wieder schliessen, da dann die Bluetooth Verbindung abgebaut wird und es beim nächsten "lesen" der Daten wieder recht lange dauert, bis die Verbindung wieder aufgebaut ist.

    Mad Andy schrieb:


    Auf'n Max232 hast du eh nicht vergessen, oder? Ich frag nur sicherheitshalber nach, weil die +/-12V einem µC nich so wirklich gefallen wollen :D
    Wie oben schon gesagt läuft die Kommunikation über Bluetooth, daher ist kein Max232 nötig.
    Hätte ihn aber auch sonst nicht vergessen :)
    Gruß
    Volker

    VoBo schrieb:

    In diesem Fall muss das Programm erst einen Befehl zum Microcontroller senden (in meinem Fall "E0")
    Daraufhin sendet der Microcontroller ein komplettes Datenfeld, welches aus 26 Bytes besteht (25 plus Prüfsumme



    Nach den senden des Bytes E0 vom PC wird das Event aktiv und erwartet 26 Byte+ Prüfsumme,danach werden die Events nicht mehr verarbeitet.

    Du kannst auch eine Erkennungsequenz zum PC senden ,dann Daten, dann Stoppsequenz.
    Das richtige mußt du natürlich selbst suchen.

    Minicode kann ich nicht geben ,da keine Erfahrung mit VB6

    Gruß
    Hi!

    Die Daten, die im Event reinkommen kannst du ja einfach ignorieren, nachdem der PC die 26 Bytes erhalten hat (also 1. Vorschlag von Fraju).

    Visual Basic-Quellcode

    1. Private Receiving as Boolean
    2. Private datalen as Integer
    3. Private Sub Button1_Click()
    4. datalen = 0
    5. Receiving = True
    6. MSComm1.Output "E0"
    7. End Sub
    8. Private Static Sub MSComm1_OnComm()
    9. Dim s As String
    10. If MSComm1.CommEvent = comEvReceive then
    11. s = MSComm1.Input
    12. If Receiving = True then
    13. datalen = datalen + len(s)
    14. if datalen >= 26 then
    15. if datalen > 26 then
    16. s = substring(s, 26)
    17. end if
    18. Receiving = False
    19. ' Daten hier verarbeiten / ausgeben, z.B.
    20. MsgBox s ' für ASCII-String
    21. MsgBox asc(substring(0,1)) ' für 1-Byte-Zahlen
    22. end if
    23. end if
    24. end if
    25. End Sub

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

    Das Prüfbyte wird in meinem Fall einfach nicht geprüft, wie üblich :D
    Ich weiß ja nicht in welcher Form das daher kommt (Xor, Addition, ...), somit kann ich auch keinen Vorschlag geben ;)
    Jedenfalls lässt sich mit Asc(Substring(...)), auch wenn etwas langsam, jedes byte einzeln auswerten. Was er dann damit macht, bleibt ihm überlassen. :)

    Edit: fu... die Funktion heißt in VB6 Mid(), nicht Substring() -.- Denk dir also überall Mid statt Substring hin.
    Argh... viel zu lange nicht mehr verwendet :(
    Hi
    Ich habe das Prog mal ausprobiert

    Allerdings wird mir immer nur ein Byte ausgegeben.

    Was für Werte sollte ich für MSComm1.RThreshold und MSComm1.InputLen verwenden ?

    Gruß und vielen Dank für eure Hilfe !
    Volker

    P.S.: Prüfbyte ist erstmal auch völlig unwichtig :D


    Visual Basic-Quellcode

    1. Private Receiving As Boolean
    2. Private datalen As Integer
    3. Private Sub Command1_Click()
    4. datalen = 0
    5. Receiving = True
    6. MSComm1.Output = "E0" + vbCr
    7. End Sub
    8. Private Sub Command2_Click()
    9. MSComm1.CommPort = 4
    10. MSComm1.Settings = "38400,N,8,1"
    11. MSComm1.RThreshold = 4
    12. MSComm1.InputLen = 1
    13. MSComm1.PortOpen = True
    14. If Err Then MsgBox "COM nicht verfügbar"
    15. End Sub
    16. Private Static Sub MSComm1_OnComm()
    17. Dim s As String
    18. If MSComm1.CommEvent = comEvReceive Then
    19. s = MSComm1.Input
    20. If Receiving = True Then
    21. datalen = datalen + Len(s)
    22. If datalen >= 26 Then
    23. If datalen > 26 Then
    24. s = Mid(s, 26)
    25. End If
    26. Receiving = False
    27. ' Daten hier verarbeiten / ausgeben, z.B.
    28. MsgBox s ' für ASCII-String
    29. MsgBox Asc(Mid(0, 1)) ' für 1-Byte-Zahlen
    30. End If
    31. End If
    32. End If
    33. End Sub
    MSComm1.InputLen = 1
    Hier ließt du bestimmt nur 1 Byte ein.
    Erhöhe auf den richtigen wert 26+ Prüfen

    edit: MSComm1.RThreshold = 4
    mußt du auch kontrollieren,dürfte die die Anzahl sein welche im Empfangspuffer sind,um ein Event auszulösen

    Gruß

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

    Hi!

    Inputlen begrenzt die Länge der einzulesenden Daten. Wenn jetzt also 26 Bytes daher kommen und InputLen=1 ist, dann wird 26 mal 1 Byte eingelesen, auch wenn die 26 Bytes "auf einmal" kommen. Bei 0 (voreingestellt) wird sofort _alles_ ausgelesen, was im Buffer steht, was bei VB-Strings relativ egal ist. Das Zusammensetzen der ankommenden Daten (aus meinem Sample) sollte man machen, um sicher zu stellen, dass der ganze Satz gelesen wird, wenn die Verbindung instabil ist (d.h. Windows zwischendurch meint, dass die Übertragung fertig ist), dann hast du nämlich u.U. <26 Bytes im Buffer.

    Natürlich hab ich in meiner Euphorie wieder Mist gebaut, weil ich den String nicht gespeichert hab. Ist im folgenden Source geändert.
    Vielleicht war die byteweise Ausgabe nicht sonderlich gut erklärt. Ich versuchs nochmal:

    Visual Basic-Quellcode

    1. Private Receiving As Boolean
    2. Private datalen As Integer
    3. Private data as String
    4. Private Sub Command1_Click()
    5. datalen = 0
    6. Receiving = True
    7. MSComm1.Output = "E0" + vbCr
    8. End Sub
    9. Private Sub Command2_Click()
    10. MSComm1.CommPort = 4
    11. MSComm1.Settings = "38400,N,8,1"
    12. ' die 2 Parameter, die von Fraju genannt wurden hab ich hier rausgeworfen.
    13. ' InputLen: siehe Beschreibung oben,
    14. ' RThreshold: musste ich noch nie ändern...
    15. MSComm1.PortOpen = True
    16. If Err Then MsgBox "COM nicht verfügbar"
    17. End Sub
    18. Private Static Sub MSComm1_OnComm()
    19. Dim s As String
    20. If MSComm1.CommEvent = comEvReceive Then
    21. s = MSComm1.Input
    22. If Receiving = True Then
    23. datalen = datalen + Len(s) ' Länge merken, geht schneller als jedes mal abzuzählen
    24. data = data & s ' hier das evntl. fragmentierte Paket zusammenführen
    25. If datalen >= 26 Then
    26. If datalen > 26 Then
    27. data = Mid(data, 26) ' hier muss natürlich auch der Datenpuffer gekürzt werden, nicht das Fragment
    28. End If
    29. Receiving = False
    30. ' Daten hier verarbeiten / ausgeben, z.B.
    31. MsgBox s ' für ASCII-String
    32. MsgBox Asc(Mid(0, 1)) ' für das 1. Byte
    33. MsgBox Asc(Mid(1, 1)) ' für das 2. Byte
    34. MsgBox Asc(Mid(2, 1)) ' für das 3. Byte
    35. MsgBox Asc(Mid(3, 1)) ' für das 4. Byte
    36. ' etc...
    37. End If
    38. End If
    39. End If
    40. End Sub

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Mad Andy“ ()

    Nur mal so, wo wird hier ein Byte aus einer Zeichenkette geholt?

    Visual Basic-Quellcode

    1. MsgBox Asc(Mid(3, 1)) ' für das 4. Byte


    Muss hier nicht irgendwie eine Quelle angegeben werden? Funktionsdefinition ist ja folgende

    Mid(Zeichenkette, Start, Länge)

    Oder liege ich da falsch?