PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfänger Fragen: inkey, waitkey oder Ischarwaiting verwenden



Jürgen75
27.09.2007, 22:40
Hallo,

mache über die RS232 eine Abfrage die dann beim richtigen Input demenstsprechend Antworten soll. Nur leider klappt es nicht so wie ich will.

Hier der Code:


'Hardware: MAX232 an PD0/PD1, Nullmodemkabel zum PC
'---------------------------------------------------
$regfile = "m8def.dat"
$crystal = 3686400 'Quarz: 3.6864 MHz
$baud = 9600 'Baudrate der UART: 9600 Baud
Config Com1 = Dummy , Synchrone = 0 , Parity = Even , Stopbits = 1 , Databits = 8 , Clockpol = 0

' set buffer for hardware UART input
Config Serialin = Buffered , Size = 254
Enable Interrupts

Dim A As Byte
Dim B As String * 7


Anfang:

B = Chr(&H00) + Chr(&H05) + Chr(&H08) + Chr(&H7d) + Chr(&H00) + Chr(&H70) + Chr(&H00)

A = Ischarwaiting()
If A = B Then
Goto Klappen:
Else
Goto Anfang:
End If

Gosub Anfang:
Klappen:

Waitms 200
Printbin &H3F ; &H06 ; &H00 ; &H0C ; &H01 ; &H39 ; &H01 ; &H0C ;
Waitms 200
Printbin &H3F ; &H06 ; &H00 ; &H0C ; &H02 ; &H39 ; &H01 ; &H0F ;
Goto Anfang:



End

Hab nur jetzt leider bei inkey und waitkey das Problem, das sobald ein Zeichen der chr( )-Kette empfangen wird gleich das ganze Programm druchläuft und quasi gleich zu "klappen:" geht.
Soll natürlich warten bis der komplette richtige Code erst empfangen wird.
Bei Ischarwaiting() passiert ganrnix.

Muß ich die Zeichen irgendwie anders abfragen oder verketten ?

Goto verwende ich jetzt schon weil die Abfrage noch erweitert werden soll...

Vielen Dank im voraus !!!

M.f.G.
Jürgen

wassermann
28.09.2007, 06:51
Hallo Jürgen75,

meine Version ist wahrscheinlich nicht die feine Art aber funktioniert.
Ich frag die Zeichen ab und wenn nach Empfang eines Zeichens eine gewisse Zeit kein neues Zeichen empfangen wird, gehe ich davon aus, dass der gesamte Befehl per RS232 empfangen worden ist.
Nach Auslösen der darauf folgenden Aktion des µC lösche ich den Befehl wieder und warte auf neue Instruktionen.

Trotzdem auch von meiner Seite: Sollte eigentlich einfacher gehen, oder?

gruss,
wassermann

PicNick
28.09.2007, 08:24
Da liegt ein mißverständnis vor
"ISCHARWAITING()" liefert "0", wenn nix da ist, und "1", wenn eins oder mehrere Zeichen da sind. Die Daten mußt du dir schon selber holen. Und beim UART mußt du sie auch selber zusammensetzen, also hintereinanderhängen.
in etwa so, wenn z.B. genau 7 Zeichen erwartet werden:


dim buffer(10) as byte
dim bufferindex as byte


Bufferindex = 1 ' Index an den Anfang

IF IsCharWaiting() <> 0 then
Buffer(Bufferindex) = INKEY()
incr Bufferindex
IF Bufferindex > 7 then
'------------- Alle Datenfelder komplett, jetzt verarbeiten ----------------
Bufferindex = 1 ' Index zurücksetzen
End If
End If

Jürgen75
28.09.2007, 10:59
Ahhh, achso. Ich muß quasi mein "input" erst kombinieren und dann mit meinem Code vergleichen.

Ich schau mir erst in ruhe die einzelnen Schritte und Befehle an. Hab zwar die Logik verstanden aber nicht genau den Ablauf.

Vielen Dank !!


Das wird bestimmt noch lustig wenn ich noch mehr solcher Abfragen mit verschiedenen Längen hinzufügen möchte.


@wassermann : nur ein Zeichen abfragen ist bei mir leider zu wenig. Brauch genau die Reihenfolge...

PicNick
28.09.2007, 11:38
..mehr solcher Abfragen mit verschiedenen Längen ..
Na, da macht man aber schon eine SUB mit der Länge als Parameter

wassermann
28.09.2007, 15:28
@Jürgen75

die Befehle, die vom PC kommen, sind nicht nur 1 Zeichen lang. Es ist so wie es PicNick beschrieben hat. Sie können unterschiedlich lang und verschieden aufgebaut sein. Die jeweilige Reaktion (je nachdem was in buffer(10) drin steht) machst du ja dann im µC.

gruss,
wassermann

Jürgen75
28.09.2007, 16:48
also so funktioniert mein neuer Code nicht:



' set buffer for hardware UART input
Config Serialin = Buffered , Size = 254
Enable Interrupts

Dim A As Byte
Dim B As String * 7
dim buffer(10) as byte
Dim Bufferindex As Byte



B = Chr(&H00) + Chr(&H05) + Chr(&H08) + Chr(&H7d) + Chr(&H00) + Chr(&H70) + Chr(&H00)

Anfang:
Bufferindex = 1
If Ischarwaiting() <> 0 Then
Buffer(Bufferindex) = INKEY()
incr Bufferindex
If Bufferindex > 7 Then
Goto Abfrage:
End If
End If

Abfrage:
If Buffer(bufferindex) = B Then
Goto Klappen:
Else
Goto Anfang:
End If


Klappen:

Waitms 200
Printbin &H3F ; &H06 ; &H00 ; &H0C ; &H01 ; &H39 ; &H01 ; &H0C ;
Waitms 200
Printbin &H3F ; &H06 ; &H00 ; &H0C ; &H02 ; &H39 ; &H01 ; &H0F ;

Bufferindex = 1 ' Index zurücksetzen

Goto Anfang:



End


jetzt läuft das Programm komplett durch wenn anscheinend ein Code darin vorkommt. Aber es soll ja erst so sein wenn die ganze Abfrage in der Reihenfolge in dem Codewirwar vorkommt.

Was mach ich falsch ?

Merci !

Jürgen75
01.10.2007, 11:22
na, weiß keiner was ? 8-[

Stromi
01.10.2007, 17:56
Brauchst doch nur im Simulator simulieren, du gehst auf jeden Fall zur Abfrage weil du nach endif nicht in ein Hauptprogramm zurück springst !!

Du solltest in der Hilfe mal unter ON INTERRUPT, spez URX schauen,
Du brauchst ein Unterprogram on interupt (urx) welches mit Return beendet wird.
Der Code ist nicht so schlecht, nur nicht fertig.

Jürgen75
06.10.2007, 00:34
Hi,

ich schnall es nicht.
Brauch ich das OnRxD wenn ich über Ischarwaiting abfrage ?
So wie ich das versteh läuft das dann im Hintergrund und es geht keine Abfrage verloren oder ?

Wenn ich mit dem AVR Terminal simuliere läuft das komplette Programm durch sobald ich &h05 (also den 2ten code) eingebe ](*,)
Egal welchen code ich vorgebe, immer wenn der 2te Code zum testen eigegeben wird läuft es durch...

PicNick
06.10.2007, 14:09
Bei
CONFIG SERIALIN = BUFFERED ........
Wird der UART-interrupt von Bascom verwendet. Wenn du ihn auch definierst, kommt ihr euch in die Quere.
"ISCHARWAITING" sieht nach, ob im Buffer ungelesene Zeichen stehen.

Jürgen75
07.10.2007, 00:51
aha ok, also muß ich das nicht umstellen, wäre aber sinnvoller....


jetzt wäre nur noch intressant warum das Programm schon beim 2. und nicht erst beim 7. richtigen Code durchläuft.

PicNick
07.10.2007, 12:40
Da seh ich das Problem, daß du ja genau das Zeichen abcheckst, das noch NICHT gekommen ist


Buffer(Bufferindex) = INKEY() DA STEHT DAS ZEICHEN

incr Bufferindex ' !!!!!!!!!!!!!!!!!!!!!!!!

If Bufferindex > 7 Then
Goto Abfrage:
End If
End If

Abfrage:
If Buffer(bufferindex) = B Then BUFFERINDEX ZEIGT EIN ZEICHEN HINTER DAS, DAS GRAD GEKOMMEN IST

Jürgen75
09.10.2007, 14:29
ja ich steh total auf der Leitung :roll:

Ich wäre sehr dankbar wenn mir jemand die komplette Lösung geben könnte.

BITTE !!!

M.f.G.
Jürgen

Jürgen75
26.11.2007, 22:41
jetzt ist bei diesem Thema schon über ein Monat vergangen und ich komme nicht weiter.

Hab es mit ONRXD , Ischarwaiting/waitkey, ringpuffer usw. probiert.

Ich bekomme erst nach dem zweiten mal eine Antwort.
d.h. wenn der Code zum zweiten mal empfangen wird geht die Antwort raus.

Was mach ich falsch ???

Es ist wie wenn noch eine Bestätigung fehlen würde das jetzt der Code richtig im Speicher liegt.

Mit diesem Code funzt es noch am besten:




$regfile = "m8def.dat"
$crystal = 3686400 'Quarz: 3.6864 MHz
$baud = 9600 'Baudrate der UART: 9600 Baud
Config Com1 = Dummy , Synchrone = 0 , Parity = Even , Stopbits = 1 , Databits = 8 , Clockpol = 0

Config Serialout = Buffered , Size = 20
Config Serialin = Buffered , Size = 20

Dim B As String * 7
Dim Check1 As String * 7
Dim Check2 As String * 7
Dim Check3 As String * 7
Dim Check4 As String * 7
Dim Check5 As String * 7
Dim Check6 As String * 7
Dim Check7 As String * 7
Dim Msg(7) As String * 1
Dim I As Byte
Dim C As Byte


Enable Interrupts

I = 0
Do
Anfang:
C = Ischarwaiting()
For I = 1 To 7
If C <> 0 Then
Msg(i) = Waitkey()
Next I
Check1 = Chr(msg(1)) + Chr(msg(2)) + Chr(msg(3)) + Chr(msg(4)) + Chr(msg(5)) + Chr(msg(6)) + Chr(msg(7))
Check2 = Chr(msg(7)) + Chr(msg(1)) + Chr(msg(2)) + Chr(msg(3)) + Chr(msg(4)) + Chr(msg(5)) + Chr(msg(6))
Check3 = Chr(msg(6)) + Chr(msg(7)) + Chr(msg(1)) + Chr(msg(2)) + Chr(msg(3)) + Chr(msg(4)) + Chr(msg(5))
Check4 = Chr(msg(5)) + Chr(msg(6)) + Chr(msg(7)) + Chr(msg(1)) + Chr(msg(2)) + Chr(msg(3)) + Chr(msg(4))
Check5 = Chr(msg(4)) + Chr(msg(5)) + Chr(msg(6)) + Chr(msg(7)) + Chr(msg(1)) + Chr(msg(2)) + Chr(msg(3))
Check6 = Chr(msg(3)) + Chr(msg(4)) + Chr(msg(5)) + Chr(msg(6)) + Chr(msg(7)) + Chr(msg(1)) + Chr(msg(2))
Check7 = Chr(msg(2)) + Chr(msg(3)) + Chr(msg(4)) + Chr(msg(5)) + Chr(msg(6)) + Chr(msg(7)) + Chr(msg(1))
B = Chr(&H00) + Chr(&H05) + Chr(&H08) + Chr(&H7d) + Chr(&H00) + Chr(&H70) + Chr(&H00)
If B = Check1 Or B = Check2 Or B = Check3 Or B = Check4 Or B = Check5 Or B = Check6 Or B = Check7 Then
Goto Klappen:
Else
Goto Anfang
End If
End If
Loop

Klappen:

Waitms 200
Printbin &H3F ; &H06 ; &H00 ; &H0C ; &H01 ; &H39 ; &H01 ; &H0C ;
Waitms 200
Printbin &H3F ; &H06 ; &H00 ; &H0C ; &H02 ; &H39 ; &H01 ; &H0F ;

Goto Anfang

End



(es sind ein paar unnütze Zeilen drinn, kommt von der probiererei)