|
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 |
Muecke Gast
|
Verfasst am: 28.09.2014, 16:16 Titel: FUNCTION Richtig erstellen |
|
|
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
|
Verfasst am: 28.09.2014, 16:50 Titel: |
|
|
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: 4616 Wohnort: ~/
|
Verfasst am: 28.09.2014, 16:55 Titel: |
|
|
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 |
|
|
Muecke Gast
|
Verfasst am: 28.09.2014, 17:15 Titel: |
|
|
bei dir sieht das viel eleganter aus,
Danke.
habe die Port nr. jedoch raus genommen denn das ist bei mir eine Konstante
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
|
Verfasst am: 28.09.2014, 17:22 Titel: |
|
|
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: 1224 Wohnort: Ruhrpott
|
Verfasst am: 28.09.2014, 17:24 Titel: |
|
|
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 |
|
|
Muecke Gast
|
Verfasst am: 28.09.2014, 17:29 Titel: |
|
|
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: 1224 Wohnort: Ruhrpott
|
Verfasst am: 28.09.2014, 17:44 Titel: |
|
|
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4616 Wohnort: ~/
|
Verfasst am: 28.09.2014, 17:49 Titel: |
|
|
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" _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Muecke Gast
|
Verfasst am: 28.09.2014, 18:01 Titel: |
|
|
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
obwohl es angezeigt wird am Monitor.
auch mit deinem Filter habe ich keine Veränderung
@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
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
|
Verfasst am: 28.09.2014, 18:14 Titel: |
|
|
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.
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
kann mir das aber nicht vorstellen das es da nichts gibt. |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4616 Wohnort: ~/
|
Verfasst am: 28.09.2014, 18:31 Titel: |
|
|
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 |
|
|
Muecke Gast
|
Verfasst am: 28.09.2014, 18:35 Titel: |
|
|
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: 1224 Wohnort: Ruhrpott
|
Verfasst am: 28.09.2014, 18:38 Titel: |
|
|
Das hört sich nach einem Timingproblem an. Versuch mal, aus dem ein (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 |
|
|
Muecke Gast
|
Verfasst am: 28.09.2014, 18:39 Titel: |
|
|
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. |
|
Nach oben |
|
|
Muecke Gast
|
Verfasst am: 28.09.2014, 18:41 Titel: |
|
|
das Sleep habe ich bis auf 1000 also eine ganze Sekunde hoch geschraubt das Selbe Ergebnis, das macht keinen unterschied
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: 1224 Wohnort: Ruhrpott
|
Verfasst am: 28.09.2014, 18:51 Titel: |
|
|
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 |
|
|
Muecke Gast
|
Verfasst am: 28.09.2014, 19:00 Titel: |
|
|
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: 1224 Wohnort: Ruhrpott
|
Verfasst am: 28.09.2014, 19:04 Titel: |
|
|
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 |
|
|
Muecke Gast
|
Verfasst am: 28.09.2014, 19:09 Titel: |
|
|
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.
Danke |
|
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.
|
|