- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 55

Thema: C# Kommunikation zwischen RP6 und Computer

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #16
    Erfahrener Benutzer Roboter-Spezialist Avatar von -schumi-
    Registriert seit
    30.12.2009
    Ort
    Wasserburg am Inn / Bayern
    Alter
    31
    Beiträge
    449
    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-
    Angehängte Dateien Angehängte Dateien

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress