| 
				
					|  | Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
 |  
 
	
		| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |  
		| Autor | Nachricht |  
		| Alexander283 
 
 
 Anmeldungsdatum: 20.01.2011
 Beiträge: 15
 Wohnort: Darmstadt
 
 | 
			
				|  Verfasst am: 20.01.2011, 19:21    Titel: Asuro und FreeBasic - Roboter über COM-Port steuern |   |  
				| 
 |  
				| Hallo Leute! Ich heisse Alex und bin neu hier im Forum und hoffe inständig, ihr könnt mir bei diesem Problem (und auch bei den zukünftigen, die mit ziemlicher Sicherheit auftreten werden) helfen könnt.
 
 Ich schreibe gerade an einem Programm, der ASURO CONTROL CONSOLE. Ich habe sie sie so ähnlich wie die Eingabeaufforderung aufgebaut, es gibt die Befehle
 
 HELP (Zeigt alle Befehle an)
 RUN (Lässt den ASURO losfahren und sammelt Werte, die der ASURO übermittelt)
 SHOW (Zeigt eine ASCII-Art Grafik des Raumes an)
 LIST (listet die gespeicherten Werte auf)
 CLEAR (löscht den Bildschirm)
 EXIT (Beendet die Konsohle)
 
 An sich geht alles mit der Oberfläche, mein Problem ist, dass ich keine Ahnung von der Benutzung des COM-Ports habe.
 
 Ich hab' mir gedacht, sobald RUN eingegeben wird, sendet der PC über den COM eine 1, der ASURO fährt los, der PC wartet, bis der Asuro den Messwert sendet und speichert diesen.
 
 ES GEHT ABER BEI MIR NICHT
   
 Ich Danke für Hilfe im Voraus.
 
 Editiert durch Moderator: Titel erweitert. (Sebastian)
 _________________
 Programmiersprachen sind dafür da, um den Computer vor dem Programmierer zu schützen
 |  |  
		| Nach oben |  |  
		|  |  
		| Alexander283 
 
 
 Anmeldungsdatum: 20.01.2011
 Beiträge: 15
 Wohnort: Darmstadt
 
 | 
			
				|  Verfasst am: 20.01.2011, 19:22    Titel: |   |  
				| 
 |  
				| PS: Der Quellcode ist auf dem Schulcomputer, den poste ich morgen. _________________
 Programmiersprachen sind dafür da, um den Computer vor dem Programmierer zu schützen
 |  |  
		| Nach oben |  |  
		|  |  
		| Sebastian Administrator
 
  
 Anmeldungsdatum: 10.09.2004
 Beiträge: 5969
 Wohnort: Deutschland
 
 | 
			
				|  Verfasst am: 20.01.2011, 19:37    Titel: |   |  
				| 
 |  
				| Hallo und willkommen im Forum! 
 Wenn du nachträglich noch Angaben zu einem Posting hinzufügen möchtest, kannst du den Beitrag einfach bearbeiten. Das heißt, es ist nicht nötig, für so eine kleine PS-Ergänzung gleich ein neues Antwort-Posting zu schreiben.
   
 Zur eigentlichen Frage: Wie du den Port in FreeBASIC öffnest, hängt natürlich ganz von der Hard- und Software der Gegenstelle ab. Über Baudrate, Parität usw. müssen sich der Mikrocontroller des ASURO-Roboters und die Schnittstelle deines PCs "einig" sein, d. h. auf beiden Seiten müssen die gleichen Einstellungen vorgenommen werden. Wenn der USART des Mikrocontrollers softwareseitig (also im ASM-/C-Programm des AVR) auf eine Baudrate von 9600 Baud eingestellt wird, muss der Port auch in FreeBASIC mit 9600 Baud geöffnet werden, damit sich Roboter und PC-Programm gegenseitig "verstehen". Daher müsstest du zuerst in Erfahrung bringen, wie die serielle Schnittstelle des Roboters konfiguriert ist. Dann können wir dir Hinweise geben, wie der STRING hinter OPEN COM aussehen könnte.
   
 Das Öffnen funktioniert dann in etwa so:
 
  	  | Code: |  	  | Const COMPort = "COM1:9600,N,8,1,ME,CS0,DS0,RS" 
 If (Open Com ( COMPort For Binary As #1 ) <> 0 ) Then
 Print "Fehler: Der Port konnte nicht geoeffnet werden!"
 Sleep: End 1
 Else
 Print "COM-Port geoeffnet"
 ...
 Close #1
 End If
 | 
 Viele Grüße!
 Sebastian
 _________________
 
   Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
 |  |  
		| Nach oben |  |  
		|  |  
		| Alexander283 
 
 
 Anmeldungsdatum: 20.01.2011
 Beiträge: 15
 Wohnort: Darmstadt
 
 | 
			
				|  Verfasst am: 20.01.2011, 19:55    Titel: |   |  
				| 
 |  
				| Äh, zwei Fragen: 
 N°1: Warum ist ein simples COM-Sende-Programm im Profi-Forum
         N°2: Ich kapier nicht, wie man die Befehle WAIT, IN und OUT benutzen soll
 
 PS: Die Bedeutung des vorgestellten Programms ist mir auch etwas vage...
 _________________
 Programmiersprachen sind dafür da, um den Computer vor dem Programmierer zu schützen
 |  |  
		| Nach oben |  |  
		|  |  
		| Sebastian Administrator
 
  
 Anmeldungsdatum: 10.09.2004
 Beiträge: 5969
 Wohnort: Deutschland
 
 | 
			
				|  Verfasst am: 20.01.2011, 20:11    Titel: |   |  
				| 
 |  
				|  	  | Alexander283 hat Folgendes geschrieben: |  	  | N°1: Warum ist ein simples COM-Sende-Programm im Profi-Forum   | 
 Der Forentitel ist vielleicht nicht ganz passend gewählt. Im Untertitel des Forums ist allerdings angegeben "Fragen zu ASM, Programmieren von Hardware/Elektronik mit QB/FB etc."
 
 
  	  | Zitat: |  	  | N°2: Ich kapier nicht, wie man die Befehle WAIT, IN und OUT benutzen soll | 
 WAIT, IN und OUT benötigst du allesamt nicht. Die funktionieren sowieso nur unter DOS 100%ig.
 
 
  	  | Zitat: |  	  | PS: Die Bedeutung des vorgestellten Programms ist mir auch etwas vage... | 
 In FreeBASIC öffnest du den COM-Port wie eine Datei und nicht über irgendwelche Registerzugriffe auf Basisadressen+Offset o.ä.
 
 So wie du eine "1" in eine Datei schreiben kannst,
 
  	  | Code: |  	  | OPEN "AlexDatei.txt" FOR BINARY AS #1 PUT #1,, "1"
 CLOSE #1
 | 
 kannst du sie auch "in den COM-Port" schreiben:
 
  	  | Code: |  	  | OPEN COM "COM1:9600,N,8,1,ME,CS0,DS0,RS" FOR BINARY AS #1 PUT #1,, "1"
 CLOSE #1
 | 
 Statt des Dateinamens AlexDatei.txt wird das Gerät, der COM-Port, angegeben.
 
 Das ist die Idee bei dem kurzen Beispiel-Code, den ich gepostet hatte. Im Vergleich zum Code oben, der eine 1 schreibt, enthält der Code in meinem ersten Posting noch eine Fehlerbehandlung für den Fall, dass die Schnittstelle nicht geöffnet werden konnte.
 
 Viele Grüße!
 Sebastian
 _________________
 
   Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
 |  |  
		| Nach oben |  |  
		|  |  
		| Alexander283 
 
 
 Anmeldungsdatum: 20.01.2011
 Beiträge: 15
 Wohnort: Darmstadt
 
 | 
			
				|  Verfasst am: 20.01.2011, 20:23    Titel: DANKE!!!!!!!!!!!!!!!!!!!!! |   |  
				| 
 |  
				| Vielen Dank für die Tipps!!! Ich werde es gleich morgen mal probieren
          _________________
 Programmiersprachen sind dafür da, um den Computer vor dem Programmierer zu schützen
 |  |  
		| Nach oben |  |  
		|  |  
		| Sebastian Administrator
 
  
 Anmeldungsdatum: 10.09.2004
 Beiträge: 5969
 Wohnort: Deutschland
 
 | 
			
				|  Verfasst am: 20.01.2011, 20:35    Titel: |   |  
				| 
 |  
				| Da, wo im ersten Code die drei Pünktchen als Auslassungszeichen stehen, könntest du z. B. mit 
 Daten an den Roboter senden.
 
 Allerdings müsstest du dich vorher (wie gesagt) vergewissern, ob der Roboter tatsächlich mit 9600 Baud arbeitet, wie ich für den Beispiel-Code jetzt einfach mal geraten habe.
  Es könnte also sein, dass du die Einstellungen hier 
  	  | Code: |  	  | 9600,N,8,1,ME,CS0,DS0,RS | 
 noch an deinen Roboter anpassen musst.
 _________________
 
   Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
 |  |  
		| Nach oben |  |  
		|  |  
		| Alexander283 
 
 
 Anmeldungsdatum: 20.01.2011
 Beiträge: 15
 Wohnort: Darmstadt
 
 | 
			
				|  Verfasst am: 21.01.2011, 14:43    Titel: Wie ist denn die Eingabe? |   |  
				| 
 |  
				| Gut, Zahlen und Zeichen kann ich jetzt an den Roboter senden, aber wie bekommeich denn Daten vom COM-Port eingelesen? 
 gibt es da so was wie
 
  	  | Code: |  	  | variable=Wert, der an COM1 gelesen wurde | 
 
 und würde
 
  	  | Code: |  	  | do variable=COM1
 loop until variable<>0
 
 | 
 
 funktionieren
  ? _________________
 Programmiersprachen sind dafür da, um den Computer vor dem Programmierer zu schützen
 |  |  
		| Nach oben |  |  
		|  |  
		| XOR 
 
 
 Anmeldungsdatum: 23.07.2010
 Beiträge: 161
 
 
 | 
			
				|  Verfasst am: 21.01.2011, 17:03    Titel: |   |  
				| 
 |  
				| Einlesen kannst du mit 
 oder
 
 |  |  
		| Nach oben |  |  
		|  |  
		| Sebastian Administrator
 
  
 Anmeldungsdatum: 10.09.2004
 Beiträge: 5969
 Wohnort: Deutschland
 
 | 
			
				|  Verfasst am: 21.01.2011, 23:48    Titel: |   |  
				| 
 |  
				| Das Empfangen von Daten funktioniert in etwa so (muss natürlich noch in das Programmgerüst eingepasst werden): 
  	  | Code: |  	  | ' ... ' Schnittstelle oeffnen (wie gehabt)
 ' ...
 '  -> Code hier einfuegen
 ' ...
 
 Dim As String Puffer, Taste
 
 Do
 ' Taste gedrueckt?
 Taste = Inkey
 If Taste = "1" Then
 Put #1, , "1"
 Print "<-- 1 an den Roboter gesendet."
 ElseIf Taste = Chr(27) Then 'ESC
 Exit Do
 End If
 ' Irgendwelche Daten bereit zum Einlesen?
 If Loc(1) > 0 Then
 Puffer = Space(Loc(1))  'Puffergroesse entsprechend festlegen
 Get #1, , Puffer
 Print "--> " & Puffer
 End If
 Sleep 1
 Loop
 
 Close #1
 | 
 _________________
 
   Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
 |  |  
		| Nach oben |  |  
		|  |  
		| Alexander283 
 
 
 Anmeldungsdatum: 20.01.2011
 Beiträge: 15
 Wohnort: Darmstadt
 
 | 
			
				|  Verfasst am: 23.01.2011, 10:47    Titel: Ginge das so? |   |  
				| 
 |  
				| Hallo, da bin ich wieder mit einem Programmentwurf. 
 Ich wollte fragen, ob dieses Programm gehen könnte.
 
 
  	  | Code: |  	  | dim word as string dim l(2) as integer
 dim cm(2) as single
 dim t as single
 t=timer
 
 const d=0.08
 
 for n=1 to 10
 for i=1 to 4
 print "Startup..."
 select case i
 case 1
 print "|"
 case 2
 print "/"
 case 3
 print "-"
 case 4
 print "\"
 end select
 
 sleep 100
 
 cls
 next i
 next n
 
 12:
 
 print "Checking COM-Port..."
 
 sleep 500
 cls
 
 SELECT CASE OPEN COM ("COM1:9600,N,8,1,ME,CS0,DS0,RS" FOR BINARY AS #1)
 case 0
 print "Port check OK"
 getkey
 case 2
 color 15,9
 cls
 print "Port does not exist!"
 print "Please check your hardware!"
 print "The console is closing now..."
 sleep 5000
 case else
 beep
 color 15,9
 cls
 print "ERROR"
 print "For retry, press ENTER"
 print "For exit, press ESCAPE"
 do
 if multikey(&H1C) then
 goto 12
 else
 if inkey=chr(27) then
 end
 endif
 endif
 
 loop
 goto 12
 end select
 end
 
 color 7
 
 print "ASURO CONTROL CONSOLE"
 print "(c) ALEXANDER DAHMEN"
 print "21.1.2011"
 ?
 
 do
 input "> ",word
 
 select case word
 case "exit","Exit","EXIT"
 end
 case "help","Help","HELP"
 gosub help_routine
 case "show","Show","SHOW"
 gosub show_routine
 cls
 print "ASURO CONTROL CONSOLE"
 print "(c) ALEXANDER DAHMEN"
 print "21.1.2011"
 case "list","List","LIST"
 gosub list_routine
 case "clear","Clear","CLEAR"
 cls
 print "ASURO CONTROL CONSOLE"
 print "(c) ALEXANDER DAHMEN"
 print "21.1.2011"
 ?
 case "run","Run","RUN"
 gosub run_routine
 case else
 beep
 print "?SYNTAX ERROR"
 end select
 loop
 end
 
 help_routine:
 print "HELP: Show a help dialog"
 print "RUN: Let the ASURO drive"
 print "LIST: List the ASURO values"
 print "SHOW: Show a room graphic"
 print "EXIT: Exit the ASURO CONTROL CONSOLE"
 return
 
 show_routine:
 cls
 if cm(1)=0 and cm(2)=0 then
 print "First let the ASURO drive"
 getkey
 return
 end if
 
 for i=1 to cm(1)
 locate i,1
 print chr(219)
 
 locate i,cm(2)*(7/5)
 print chr(219)
 next i
 
 for i=1 to cm(2)*(7/5)
 locate 1,i
 print chr(219)
 
 locate cm(1),i
 print chr(219)
 next i
 getkey
 return
 
 list_routine:
 print "LENGH X: ";cm(1);" cm"
 print "LENGH Y: ";cm(2);" cm"
 return
 
 run_routine:
 print "LOADING..."
 OPEN COM "COM1:9600,N,8,1,ME,CS0,DS0,RS" FOR BINARY AS #1
 PUT #1,,"1"
 for i=1 to 2
 do
 get #1,,l(i)
 if inkey=chr(27) then
 print "ABORT LOADING"
 return
 endif
 loop until l(i)<>0
 next i
 
 for i=1 to 2
 cm(i)=(l(i)/4)*(3.141*d)
 next i
 close #1
 print "VALUES LOAD"
 return
 
 | 
 _________________
 Programmiersprachen sind dafür da, um den Computer vor dem Programmierer zu schützen
 |  |  
		| Nach oben |  |  
		|  |  
		| XOR 
 
 
 Anmeldungsdatum: 23.07.2010
 Beiträge: 161
 
 
 | 
			
				|  Verfasst am: 23.01.2011, 18:02    Titel: |   |  
				| 
 |  
				| Aendere die gosubs in subs um, dann solltest du aber l(2) und cm(2) als shared dimensionieren. Der startub ist nett aber ueberfluessig. Das end in zeile 66 beendet das Pogram bevor man ueberhaut im richtigen Menue ist. Statt deinen gotos kann man auch eine do schleife anwenden. Du solltest den Port am ende mit Close #1 schliessen. In zeile 46 fehlt ein end. 
  	  | Zitat: |  	  | Ich wollte fragen, ob dieses Programm gehen könnte. | 
 Nein!
 Die -lang fb fehler, weil nicht alle variablen dimensioniert wurden, bei den gosubs und dem gotoPoint 12, den du in P12: umbenennen solltest, fals du da keine schleife willst.
 Bei -land deprecated nur fehler bei den gosubs
 Bie -lang qb fehler bei gosub und anderen stellen.
 Wegen den Gosubs:
 
  	  | Zitat: |  	  | Seit FreeBASIC v0.16b, März-Release ist es nicht mehr zulässig, GOSUB auf Prozedurebene zu verwenden. | 
 du solltest also mal subs verwenden, ausser du hast eine kleinere version, dann soltest du dir aber dringend die neue holen.
 das mit dem goto kanst du so loesen:
 
  	  | Code: |  	  | Do 
 print "Checking COM-Port..."
 
 sleep 500
 cls
 
 SELECT CASE OPEN COM ("COM1:9600,N,8,1,ME,CS0,DS0,RS" FOR BINARY AS #1)
 case 0
 print "Port check OK"
 Sleep
 Exit do
 case 2
 color 15,9
 cls
 print "Port does not exist!"
 print "Please check your hardware!"
 print "The console is closing now..."
 Sleep
 End
 case else
 beep
 color 15,9
 cls
 print "ERROR"
 print "For retry, press ENTER"
 print "For exit, press ESCAPE"
 do
 If inkey=chr(27) then
 End
 EndIf
 loop Until multikey(&H1C)
 end Select
 Loop
 
 | 
 |  |  
		| Nach oben |  |  
		|  |  
		|  |  
  
	| 
 
 | Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten.
 Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
 Du kannst deine Beiträge in diesem Forum nicht löschen.
 Du kannst an Umfragen in diesem Forum nicht mitmachen.
 
 |  |