Code:
DECLARE SUB RP6_reset () ' Die SUBs sind dann Befehle mit Parametern,
DECLARE SUB RP6_getID (Board AS STRING) ' der Code dazu steht am Ende des Progs
DECLARE SUB errorhandler (errormessage AS STRING)
DECLARE function RP6_Batteryvoltage () AS double ' Wie eine SUB, nur das man es als Variable
' verwendet, Code steht auch am Ende
DIM AS STRING sendstring, receivestring, inputtemp, Board ' Variablen: String = Satz bzw. Buchstaben
DIM AS STRING*1 temp ' String, in den nur 1 Buchstabe rein passt
DIM AS INTEGER letternumber ' Ganzzahl, 16 Bit (-32768 bis 32767)
DIM AS DOUBLE batvoltage ' Gleitpunktzahl, 64 Bit,
' 16 Nachkommastellen
SCREENRES 640,480,32 ' Fenster machen: 640*480 Pixel, 32 Bit Tiefe
COLOR 0, RGB(255,255,255) ' Farbe: Text Schwarz, Hintergrund Weis
CLS ' Fenster mit Hintergrundfarbe löschen
PRINT ' Nächste Zeile
PRINT "Resetting.."; ' Text ausgeben
RP6_RESET ' SUB wird aufgerufen (siehe unten)
PRINT " Done"
OPEN com "com3: 38400, N, 8, 1,cs0,ds0,cd0,rs" AS #1 'Com3 wird geöffnet mit:
' - 38400 Baud Übertragungsgeschwindigkeit
' - keine Parität (N steht für none)
' - 8 Datenbits
' - 1 Stopbit
' - CTS abschalten
' - DSR abschalten
' - "Carrier Datect"-Dauer abschalten
' - unterdrücke RTS-Erkennung
PRINT
PRINT "Trying to get right ID..";
RP6_GETID Board ' Hier wird von der SUB ein Wert (welches Board
' am PC hängt) in den Parameter geschrieben,
' hätte man auch als Function machen können
PRINT " Done"
PRINT "Got right ID from "+Board
PRINT
IF Board = "Base-Board" THEN ' Weil nur das Base-Board die Akkuspannung
' auslesen kann
PRINT "Reading batteryvoltage..";
batvoltage=RP6_BATTERYVOLTAGE () ' Hier wird die Function aufgerufen
PRINT " Done"
PRINT "Batteryvoltage is ";
PRINT USING "#.##"; batvoltage; ' Inhalt von batvoltage (Zahl) in der Form
' X.XX ausgeben. ";" heißt nicht in die
' nächste Zeile, sondern dahinter
' weiterschreiben
PRINT " V" ' für Volt
ENDIF
'Hier wird noch ausgegeben was der RP6 sendet bis man das Programm beendet
DO
if (LOC(1) > 0) THEN ' Falls was im Com-port-Puffer drin ist
GET #1,,temp ' Buchstabenweise in temp speicher
PRINT temp; ' auf den Bildschirm malen
ENDIF
LOOP UNTIL INKEY$=CHR(27) OR INKEY$ = CHR(255)+"k" ' ESC gedrückt oder auf das X geklickt wird
CLOSE #1 ' Com-Port wieder Schließen
SYSTEM ' Programm beenden (zu System zurück kehren)
'==================== SUBs & Functionen ============================================================
SUB RP6_reset () ' RP6 resetten, damit der Bootloader
' auf Befehle wartet
' (Im Terminal des RP6Loaders "[RP6BOOT]")
OPEN com "com3: 38400, N, 8, 1,cs0,ds0,cd0" AS #1 ' Com-Port öffnen, aber RTS setzen, damit der
' RP6 resettet
SLEEP 2 ' 2ms lang resetten
CLOSE #1 ' Den Com-Port wieder schließen
END SUB
SUB RP6_getID (Board AS STRING) ' Jedes Board hat eine andere ID, damit der
' RP6Loader unterscheiden kann was
' angeschlossen ist. Das ist wichtig
' weil nur die Base-Station die Akkuspannung
' auslesen kann
DIM AS STRING receivestring
DIM AS STRING*1 temp
DIM AS LONG starttime ' Ganzahl 32 Bit
DIM AS INTEGER letternumber
starttime = TIMER ' TIMER gibt immer die Sekunden seit
' Mitternacht zurück
receivestring = ""
DO ' Schleife
IF (LOC(1) > 0) THEN ' Falls im Port (geöffnet als #1) was drinliegt
GET #1,,temp ' dann in Buchstabenweise in temp speichern
receivestring=receivestring+temp ' und an receivestring anfügen
ENDIF
IF starttime+3<TIMER THEN ERRORHANDLER "Not able to get RP6BOOT-message!" 'falls 3+ sec. vorbei
' dann die ERRORHANDLER-sUB aufrufen mit dem
' String als Parameter
LOOP UNTIL INSTR(receivestring,"[RP6BOOT]") ' Gehe zu Schleifenanfang bis "[RP6BOOT]" im
' receivestring enthalten ist
PUT #1,,CHR(72) ' Buchstabe mit dem ASCII-wert 72 an Com-Port
' senden (immer noch als #1 geöffnet)
starttime=TIMER
receivestring=""
DO ' nochmal das Gleiche, nur für die Controler-ID
if (LOC(1) > 0) THEN
GET #1,,temp
receivestring=receivestring+temp
letternumber=letternumber+1
ENDIF
IF starttime+3<TIMER THEN ERRORHANDLER "RP6 is not sending a Controller-ID!"
LOOP UNTIL letternumber>8 ' ...bis er 8 Buchstaben gesendet hat
IF INSTR(receivestring, "RP6:"+CHR(1)+CHR(1)+CHR(4)+CHR(5)) THEN 'Code für das BaseBoard
Board="Base-Board"
ELSEIF INSTR(receivestring, "RP6:"+CHR(2)+CHR(1)+CHR(4)+CHR(3)) THEN 'Code für das M32
Board="M32-Control-Board"
ELSE ' Falls es keine der beiden
' ID's ist
Board="No Board found! - Got wrong ID!"
ERRORHANDLER "No Board found! - Got wrong ID!"
ENDIF
END SUB
SUB errorhandler (errormessage AS STRING)
PRINT
PRINT
PRINT "ERROR--ERROR--ERROR"
PRINT
PRINT "Details: "+errormessage
PRINT
PRINT "ERROR--ERROR--ERROR"
CLOSE #1 ' Nach dem Errorhandler wird das Programm
' nicht mehr weiter ausgeführt, also Port
' schließen
SLEEP ' Auf Tastendruck warten
SYSTEM ' Beenden
END SUB
FUNCTION RP6_Batteryvoltage () AS DOUBLE ' Diese Function ist eine DOUBLE-Variable
DIM AS LONG starttime
DIM AS STRING receivestring
DIM AS INTEGER letternumber
DIM AS STRING*1 temp
PUT #1,,CHR(149) ' Buchstabe mit dem ASCII-wert 149 senden
starttime=TIMER
receivestring=""
letternumber=0
DO ' Das selbe wie in der RP6_getID-sUB
if (LOC(1) > 0) THEN
GET #1,,temp
receivestring=receivestring+temp
letternumber=letternumber+1
ENDIF
IF starttime+3<TIMER THEN ERRORHANDLER "Can't get batteryvoltage!"
LOOP UNTIL letternumber>2 ' Bis er 2 Buchstaben gesendet hat
rp6_batteryvoltage=(ASC(receivestring,1)+256*ASC(receivestring,2))/100 'Der Wert für die
' Akkuspannung besteht aus 16 Bit. Die sind
' aufgeteilt in 2 mal 8 Bit, die die ASCII-Werte
' Der jeweils gesendeten Buchstaben entsprechen
' Dann das ganze nur noch durch 100 teilen
END FUNCTION
Anbei noch die *.exe
Lesezeichen