|
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.
|
|