Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Asuro und FreeBasic - Roboter über COM-Port steuern

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Alexander283



Anmeldungsdatum: 20.01.2011
Beiträge: 15
Wohnort: Darmstadt

BeitragVerfasst am: 20.01.2011, 19:21    Titel: Asuro und FreeBasic - Roboter über COM-Port steuern Antworten mit Zitat

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 mit dem Kopf durch die Mauer wollen

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
Benutzer-Profile anzeigen Private Nachricht senden
Alexander283



Anmeldungsdatum: 20.01.2011
Beiträge: 15
Wohnort: Darmstadt

BeitragVerfasst am: 20.01.2011, 19:22    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5895
Wohnort: Deutschland

BeitragVerfasst am: 20.01.2011, 19:37    Titel: Antworten mit Zitat

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

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. lächeln

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
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Alexander283



Anmeldungsdatum: 20.01.2011
Beiträge: 15
Wohnort: Darmstadt

BeitragVerfasst am: 20.01.2011, 19:55    Titel: Antworten mit Zitat

Äh, zwei Fragen:

N°1: Warum ist ein simples COM-Sende-Programm im Profi-Forum Hmmm.... Hmmm.... Hmmm.... Hmmm....
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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5895
Wohnort: Deutschland

BeitragVerfasst am: 20.01.2011, 20:11    Titel: Antworten mit Zitat

Alexander283 hat Folgendes geschrieben:
N°1: Warum ist ein simples COM-Sende-Programm im Profi-Forum Hmmm....

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
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Alexander283



Anmeldungsdatum: 20.01.2011
Beiträge: 15
Wohnort: Darmstadt

BeitragVerfasst am: 20.01.2011, 20:23    Titel: DANKE!!!!!!!!!!!!!!!!!!!!! Antworten mit Zitat

Vielen Dank für die Tipps!!!
Ich werde es gleich morgen mal probieren Daumen rauf! vor lachen auf dem Boden rollen grinsen Yahooo!!!! vor Freude klatschen
_________________
Programmiersprachen sind dafür da, um den Computer vor dem Programmierer zu schützen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5895
Wohnort: Deutschland

BeitragVerfasst am: 20.01.2011, 20:35    Titel: Antworten mit Zitat

Da, wo im ersten Code die drei Pünktchen als Auslassungszeichen stehen, könntest du z. B. mit
Code:
PUT #1, , "1"

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. zwinkern 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.
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Alexander283



Anmeldungsdatum: 20.01.2011
Beiträge: 15
Wohnort: Darmstadt

BeitragVerfasst am: 21.01.2011, 14:43    Titel: Wie ist denn die Eingabe? Antworten mit Zitat

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 verwundert ?
_________________
Programmiersprachen sind dafür da, um den Computer vor dem Programmierer zu schützen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 21.01.2011, 17:03    Titel: Antworten mit Zitat

Einlesen kannst du mit
Code:
get #1,,Variable

oder
Code:
input #1,Variable
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5895
Wohnort: Deutschland

BeitragVerfasst am: 21.01.2011, 23:48    Titel: Antworten mit Zitat

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

_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Alexander283



Anmeldungsdatum: 20.01.2011
Beiträge: 15
Wohnort: Darmstadt

BeitragVerfasst am: 23.01.2011, 10:47    Titel: Ginge das so? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 23.01.2011, 18:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz