Ich habe für mein aktuelles Projekt Datenpakete per UART zu empfangen.
Vorgabe ist das empfangen von 16Byte für die weiterverarbeitung im Hauptprogramm.
Aktuell ist es so gelöst, das die Pakete jeweils mit einem vorgegebenen Startzeichen beginnen müssen.
Diese sind dann entweder bis 16Byte begrenzt oder werden durch ein vorgegebenes Endzeichen abgeschlossen.
Ich möchte mir damit eine art Universelle Übertragung schaffen, die ich für weitere Projekte einfach anpassen kann.
Der Code sieht so aus:
Code:
'-------------------------------------------------------------------------------
'Variablen
'-------------------------------------------------------------------------------
Dim Temp_byte As Byte
Dim Datenblock(16) As Byte
Dim Indexposition As Byte
Dim Startzeichen As String * 1
Startzeichen = "{"
Dim Endzeichen As String * 1
Endzeichen = "}"
Dim Datenblock_komplett As Bit
Dim Datenblock_laenge As Byte
Datenblock_laenge = 16
Dim Datenblock_string As String * 16
'-------------------------------------------------------------------------------
'Hauptprogramm
'-------------------------------------------------------------------------------
Do
If Datenblock_komplett = 1 Then
For Indexposition = 1 To Datenblock_laenge Step 1
Insertchar Datenblock_string , Indexposition , Datenblock(indexposition)
Next
Print Datenblock_string
Datenblock_string = ""
Datenblock_komplett = 0
End If
Loop
End
'-------------------------------------------------------------------------------
'Interrupt
'-------------------------------------------------------------------------------
Serial0charmatch:
While Ischarwaiting() = 1
Temp_byte = Inkey()
waitus 2000
If Temp_byte = Asc(startzeichen) Then
Indexposition = 0
Datenblock_komplett = 0
Elseif Temp_byte = Asc(endzeichen) Then
Datenblock_komplett = 1
Else
Indexposition = Indexposition + 1
Datenblock(indexposition) = Temp_byte
End If
If Indexposition = Datenblock_laenge Then
Datenblock_komplett = 1
Clear Serialin
End If
Wend
If Indexposition < Datenblock_laenge Then
Do
Indexposition = Indexposition + 1
Datenblock(indexposition) = 0
Loop Until Indexposition = Datenblock_laenge
Datenblock_komplett = 1
End If
Return
Funktioniert soweit auch zufriedenstellend.
Kurz noch Beispiele...
Code:
{1234567890123456} ergibt 1234567890123456
{123456 ergibt 123456
{123456} ergibt 123456
123456 ergibt "nix" (weil kein Startzeichen)
Allerdings möchte ich gerne eure Meinung hören, inwieweit es da zu Problemem kommen kann,
oder ob man das noch optimieren könnte (speziell wegen der Abarbeitungszeit im Interupt).
Derzeit wird per Kabel übertragen... soll aber die nächsten Tage durch ein Funkmodul (APC220) ersetzt werden.
P.S. ... sorry, das es nicht auskommentiert ist... sollte aber trotzdem leicht überschaubar sein.
Lesezeichen