Liste der Anhänge anzeigen (Anzahl: 1)
So, hier wie vesprochen da Beispiel zum Akkuspannung auslesen, einfacher und ausführlichst kommentiert, damit kannst du glaub ich mehr anfangen...
(am besten in Notepad reinkopieren, sonst sind teilweise die Kommentare so verschoben und das Ganze is wahnsinnig unübersichtlich)
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
MfG
-schumi-