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:

FUNCTION Richtig erstellen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Muecke
Gast





BeitragVerfasst am: 28.09.2014, 15:16    Titel: FUNCTION Richtig erstellen Antworten mit Zitat

Hallo miteinander

ich sende über den COM Port befehle und muss die Antworten abfangen.
ich möchte das hier in eine Funktion Packen.

Code:
         zeit = TIMER
         DO
              Sleep 1  ' Prozessorlast senken
              If LOC(1) >0 then
               z = input$(1,#1)
               If z = CHR$(13) Then
                  Print Befehl
                  Exit Do
               Else
                  Befehl = Befehl & z
               EndIf
              End If          
         LOOP UNTIL TIMER > zeit + 15


Würde das dann gerne so abfragen können:

Code:
if Antwort = "ok" Then Print "perfekt"
Else Print "war nichts"
EndIf


ich kapiere das nur nicht wie man das machen muss denn ich habe ja den Com Port geöffnet und muss das irgend wie in die Funktion hinein bringen.

kann mir da jemand ein Beispiel zeigen wie man so was macht?

Gruß
Nach oben
Muecke
Gast





BeitragVerfasst am: 28.09.2014, 15:50    Titel: Antworten mit Zitat

ich glaube ich habe da was hin bekommen:

Code:

      Declare Function Antwort (Befehl As String) As String
            Print Antwort (Befehl)

Function Antwort (Befehl As String) As String
   
   Befehl = ""
   dim as string z
   Dim As Double zeit         
         
   zeit = TIMER
   DO
        Sleep 1  ' Prozessorlast senken
        If LOC(1) >0 then
         z = input$(1,#1)
            If z = CHR$(13) Then
               ' Print Befehl
               Return Befehl
               Exit Do
            Else
               Befehl = Befehl & z
            EndIf
           End If          
   LOOP UNTIL TIMER > zeit + 15
End Function



was meint Ihr dazu?
Nach oben
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 28.09.2014, 15:55    Titel: Antworten mit Zitat

Du könntest die Port-Nummer als Parameter übergeben.

Code:
FUNCTION readCom(port as integer) AS STRING
     DIM AS STRING befehl = "", z
     DIM AS DOUBLE zeit = TIMER
     DO
        SLEEP 1  ' Prozessorlast senken
        IF LOC(port) > 0 THEN
        z = INPUT(1,#port)
            IF z = CHR(13) THEN
                PRINT Befehl
                EXIT DO
            ELSE
                Befehl = Befehl & z
            END IF
        END IF         
    LOOP UNTIL TIMER > zeit + 15
    RETURN befehl
END FUNCTION


edit: ich sehe gerade, dass du inzwischen schon was gepostet hast - aber wozu willst du der Funktion schon einen Befehlsinhalt mitgeben? Die liest doch bereits eine gesamte Zeile aus? Einen Parameter zu übergeben, nur um ihn dann sofort zu verwerfen, macht so wieso keinen großen Sinn. Die Rückgabe bei einer Funktion läuft viel besser über RETURN.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Muecke
Gast





BeitragVerfasst am: 28.09.2014, 16:15    Titel: Antworten mit Zitat

bei dir sieht das viel eleganter aus,
Danke.


habe die Port nr. jedoch raus genommen denn das ist bei mir eine Konstante zwinkern

mein Arduino sendet "ok/n" zurück.

wenn ich nun mit der Funktion aber eine Abfrage nach ok mache finde ich das nicht obwohl es auf dem Monitor ist:
muss ich das "/n" auch-noch abfragen? was ist das für ein zeichne?


das ist der Aktuelle Code:

Code:

...
      Declare Function readCom() AS String
....
             Print #1, "configure,2,0,500"
             If readCom = "ok" Then
                Print "past"
             Else
                Print "NEIN"
             EndIf
...
FUNCTION readCom() AS STRING
     DIM AS STRING befehl = "", z
     DIM AS DOUBLE zeit = TIMER
     DO
        SLEEP 1  ' Prozessorlast senken
        IF LOC(1) > 0 THEN
        z = INPUT(1,#1)
            IF z = CHR(13) THEN
                PRINT Befehl
                EXIT DO
            ELSE
                Befehl = Befehl & z
            END IF
        END IF         
    LOOP UNTIL TIMER > zeit + 15
    RETURN befehl
END Function



da der Befehl PRINT noch beim finden des Zeichens CHR(13) drin ist wird mir das ok auf dem Monitor angezeigt jedoch bekomme ich dann auch das nein dazu angezeigt.

was mich etwas verwirrt. denn es sollte ja eigentlich "past" anstatt "Nein" dastehen.

an was könnte das Ligen?
Nach oben
Muecke
Gast





BeitragVerfasst am: 28.09.2014, 16:22    Titel: Antworten mit Zitat

habe gerade bei der Ausgabe vom Befehl mal die lege berechnen lassen und da ist wirklich ein Zeichen zu viel mit dabei. denn bei dem Wirt "ok" kommt drei raus.

jetzt ist nur die Frage was ist das für ein zeichne? wie kann ich das raus finden?
Nach oben
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 28.09.2014, 16:24    Titel: Antworten mit Zitat

Hallo Muecke!

"/n" steht für "new line", also für "neue Zeile" und entspricht einem Chr(13,10)

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Muecke
Gast





BeitragVerfasst am: 28.09.2014, 16:29    Titel: Antworten mit Zitat

OK das bedeutet das ich also eine weitere ziele mit drin hängen habe.

dann muss ich also das Letzte zeichne Löschen.

äm das war MID ? glaube ich.
Nach oben
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 28.09.2014, 16:44    Titel: Antworten mit Zitat

Nein, damit signalisiert der Arduino nur, daß dort die Zeile zuende ist. Eine genaue Erklärung dieses Zeichens findest du hier.

Wenn du genau wissen möchtest, was dein Arduino dir sagt, kannst du dir mit
Code:
For x As Integer = 0 To Len(befehl) - 1
   Print befehl[x];" ";
Next
Print
die Ascii - Werte der einzelnen Zeichen anzeigen lassen. Und die angehängte Escape - Sequenz entfernst du am besten mit
Code:
befehl = Left(befehl,InStrRev(befehl, Any"/\") - 1)
.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 28.09.2014, 16:49    Titel: Antworten mit Zitat

Für newline wird üblicherweise "\n" genommen, nicht "/n" - wenn tatsächlich "/n" gesendet wird, solltest du am besten danach suchen und nicht nach "ok" (sonst nach chr(10)), immerhin könnte das Gerät ja auch mal "oklahoma" senden oder sonst was. Man sollte sich nicht unbedingt darauf verlassen, dass genau das gesendet wird, was man will; immerhin könnte es ja später Gerät-Updates geben, und dann sollte man den Aufwand für Software-Anpassung von vornherein minimal halten.

Und CHR(13, 10) wäre üblicherweise ein "\r\n" grinsen
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Muecke
Gast





BeitragVerfasst am: 28.09.2014, 17:01    Titel: Antworten mit Zitat

also habe jetzt den Zeilenumbruch von 13 auf 10 geändert, jetzt wird mir eine Länge von 2 angeben.

Jedoch kann ich das "ok" immer noch nicht finden traurig
obwohl es angezeigt wird am Monitor.

auch mit deinem Filter habe ich keine Veränderung traurig



@nemored: ja du hast recht da sollte man aufpassen falls es ein Update gibt doch das muss ich auch ich Programmiren. *das Programm auf dem Arduino kommt von mir*
ich habe eine Tropfen auf Tropfen Anlage gebaut die ich nun etwas ausreizen möchte.


Das Arduino Sendet
Code:
response = "OK\n";


das war ein Typfehler von meiner Seite her. Sorry.


Arrr ward noch verrückt wie bekomme ich nun das weg?
so das ich das OK finden kann?


was mich auch verwundert wenn ich kann ja Öffters was Senden lassen und mir immer das ergebnis ausgeben lassen gerade

wenn ich zwei mal hintereinander was weg sende bekomme ich ein mal das OK (2 Zeichen) zurück und ein mal kommt nur ein "kein Text in der Anzeige" Länge 1 zurück
beim dritten mal kommt wider ein OK und Zeichenlänge 2.
ist da dann noch was im Puffer das zuerst gelöscht werden muss?


das ist mein Aktueller vollständiger Code.

Code:
SCREENRES 400, 100, 16

' Variablen
      dim as string  t
      dim as integer port
      Dim As Double  zeit
      
      DECLARE SUB Monitor
      Declare Sub Fehler_Ende
      Declare Function readCom() AS String
      
      port = 5
      
      Const COMPort = "COM5:9600,N,8,1,ds0"

   ScreenRes 400, 100, 16                                             ' Fenster Größe definiren

   Monitor                                                            ' Grundgerüßt Monitor Laden

   If (Open Com ( COMPort For Binary As #1 ) <> 0 ) Then               ' COM Öffnen und Prüfen
      Fehler_Ende                                                      ' COM nicht gefunden 
   Else                                                               ' COM gefunden
      Locate  7, 20: Color RGB(000, 153, 000): Print "geoeffnet"

      Do:  t = inkey$
      ' Tastatur
         If t = "1" Then                                              ' Taste 1 wurde gedrückt
            
             Print #1, "configure,2,0,500"
             If readCom = "ok" Then
                Print "past"
             Else
                Print "NEIN"
             EndIf
         EndIf
      
         If t = "2" Then                                              ' Taste 2 wurde gedrückt
         EndIf

         If t = "3" Or t = CHR$(27) Then                               ' Taste 3 wurde gedrückt
            Close #1   ' Port Schlissen
            End
         EndIf

        Sleep 1  ' Prozessor endlasstung
      Loop
   End If
End


Sub Monitor

   Locate  3,  5: Color RGB(255, 255, 255): Print "Arduino"
   Locate  3, 20: Color RGB(255, 255, 255): Print "Tropfenbox"
   Locate  3, 35: Color RGB(255, 255, 255): Print "V 2.0.1"

   Locate  6,  8: Color RGB(255, 255, 255): Print "COM-Port: " &    COMPort
   Locate  7,  8: Color RGB(255, 255, 255): Print "COM-Status:"
   
   Locate  9,  8: Color RGB(255, 255, 102): Print "1 = Start"
   Locate 10,  8: Color RGB(255, 255, 102): Print "2 = Abbruch"
   Locate 11,  8: Color RGB(255, 255, 102): Print "3 = Programm Ende"

   Locate  9, 31: Color RGB(255, 255, 225): Print "Start"
   Locate 10, 31: Color RGB(255, 255, 225): Print "Ende"
   Locate 11, 31: Color RGB(255, 255, 225): Print "Aktuell"

End Sub

Sub Fehler_Ende
   Locate  7, 20: Color RGB(255, 000, 000)
   Print "konnte nicht geoeffnet werden!"
   Sleep
   End
End Sub

FUNCTION readCom() AS STRING
     DIM AS STRING Befehl = "", z
     DIM AS DOUBLE zeit = TIMER
     DO
        SLEEP 1  ' Prozessorlast senken
        IF LOC(1) > 0 THEN
        z = INPUT(1,#1)
            IF z = CHR(10) THEN
                PRINT Befehl
                Print Len(Befehl)
                Befehl = Left(Befehl,InStrRev(Befehl, Any"/\") - 1)
                EXIT DO
            ELSE
                Befehl = Befehl & z
            END IF
        END IF         
    LOOP UNTIL TIMER > zeit + 15
    RETURN Befehl
END Function





EDIT:

Ihr dürft mich Schlagen, ich bin doch ein Depppp
das Arduino Sendet OK nicht ok

man, Herr schmeiß doch ein wenig Hirn herunter, bitte bitte ich kann was brauchen.
Nach oben
Muecke
Gast





BeitragVerfasst am: 28.09.2014, 17:14    Titel: Antworten mit Zitat

OK das klapt nun.

Jetzt habe ich an euch echte Profis noch eine Frage.

der erste Befehl sendet "OK"
der zweite Sendet auch "OK"
das habe ich über ein Terminal versucht klappt.

in meinem Basic Programm kommt das zweite "OK"
aber nicht ganz an. traurig
angezeigt wird auf dem Monitor gar nichts und als Länge wird mir zurück gegeben 1 Zeichen sollten aber zwei sein.

habe ich jetzt noch etwas im Puffer das ich Löschen sollte bevor ich einen neuen Befehl los sende?

Wie kann ich den Seriellen Puffer Löschen?


Der Befehl wird wirklich nur Falsch ausgelesen denn das Arduino Reagiert richtig.
also gehe ich davon aus das was im Puffer ist das meine Abfrage durcheinander bringt.

ich kann zu dem Thema Seriellen Puffer Löschen nichts finden traurig
kann mir das aber nicht vorstellen das es da nichts gibt.
Nach oben
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 28.09.2014, 17:31    Titel: Antworten mit Zitat

Normalerweise müsstest du den seriellen Puffer genauso löschen wie einen Tastaturpuffer - so lange auslesen, bis er leer ist. Aber vielleicht ist es nötig, nachdem du alles ausgelesen hast, den Port erst wieder zu schließen und neu zu öffnen. Ich kann da leider nur spekulieren.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Muecke
Gast





BeitragVerfasst am: 28.09.2014, 17:35    Titel: Antworten mit Zitat

das mit dem Auslesen habe ich mir gerade auch gedacht, und versuche gerade mal was dazu zu bauen.

wenn ich die Schnittelle Neu Öffne dann verliert mein Arduino sein Kurzzeitgedächtnis denn dann wird die Firmware neu gebootet.
Nach oben
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 28.09.2014, 17:38    Titel: Antworten mit Zitat

Das hört sich nach einem Timingproblem an. Versuch mal, aus dem
Code:
Sleep 1
ein
Code:
Sleep 100
(oder noch mehr) zu machen.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Muecke
Gast





BeitragVerfasst am: 28.09.2014, 17:39    Titel: Antworten mit Zitat

ich dachte mir das ich so das teil volständig auslese:

Code:
Function LeerCom () As String
     DIM AS STRING Befehl = "", z = ""
     DIM AS DOUBLE zeit = TIMER
     DO
        SLEEP 1  ' Prozessorlast senken
        IF LOC(1) > 0 THEN
           z = INPUT(1,#1)
        END IF         
    LOOP UNTIL LOC(1) <= 0

End Function


nur das klappt wohl nicht richtig.
denn ich habe noch immer das Selbe Ergebnis wie vorher. traurig
Nach oben
Muecke
Gast





BeitragVerfasst am: 28.09.2014, 17:41    Titel: Antworten mit Zitat

das Sleep habe ich bis auf 1000 also eine ganze Sekunde hoch geschraubt das Selbe Ergebnis, das macht keinen unterschied traurig

also alles auslesen bis nichts mehr drin ist.

doch wie? so wie ich es Oben gemacht habe klappt es scheinbar nicht.
Nach oben
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 28.09.2014, 17:51    Titel: Antworten mit Zitat

Bist du sicher, daß der Arduino am Zeilenende nur ein Chr(10) sendet? Lies den Puffer einmal komplett aus und lass dir die Ascii - Codes der Zeichen anzeigen, damit du auch nicht druckbare Zeichen angezeigt bekommst
Code:
IF LOC(1) > 0 THEN
           z = INPUT(1,#1)
           Print z[0];" ";
        END IF   
Vielleicht steckt ja noch ein Zeichen im Puffer.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Muecke
Gast





BeitragVerfasst am: 28.09.2014, 18:00    Titel: Antworten mit Zitat

Oh man, wenn ich das nicht heute Abend machen wollte wäre das ja nicht so Stressig. arrrrr.....


also bei meinem Config... Befehl kommt als Antwort
"97 75 10" das past
bei meinen Befehl "go" kommt nun nur noch als Antwort
"13 10"

das verstehe ich zwar nicht warum, doch damit kann ich jetzt arbeiten.
ich glaube die Firmware muss ich noch mal genau durchschauen, da ist auch der Wurm drin.

Mal schauen ob ich die 13 10 nun abgefragt bekomme.

das müsste ja so gehen:
Code:
If readCom = CHR(13) + Chr(10) Then
Nach oben
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 28.09.2014, 18:04    Titel: Antworten mit Zitat

Alternativ könntest du auch die readCom() ergänzen:
Code:

            ELSE
                Befehl = Befehl & z
                Print Asc(z);" ";
            END IF
Damit bekommst du den gesamten Datenstrom angezeigt.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Muecke
Gast





BeitragVerfasst am: 28.09.2014, 18:09    Titel: Antworten mit Zitat

da bekomme ich dann nur noch die 13 bei meinem "go" Befehl.

Arrr, ... eigentlich sollte da auch ein OK gesendet werden, denn die 13 ist schlecht, die ist beim einem Fehler nämlich auch hinten dran.

Dann muss ich mir jetzt die Firmware vornehmen.

Danke erst mal.

wenn ich kurz vorm Haare ausreisen wider bin melde ich mich noch mal. zwinkern

Danke
Nach oben
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. 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