Forum: Mikrocontroller und Digitale Elektronik Bascom- Schleifenabbruch mittels RS232-String


von Tilmann (Gast)


Lesenswert?

Hallo,

ich möchte eine Endlosschleife, die ich per RS232-String gestartet habe, 
auf diesem Weg auch anhalten können. Das habe ich schon probiert, ich 
kann die Schleife aber nicht stoppen; es scheint, daß die Variable, die 
ich als Abbruchkriterium definiert habe, garnicht aktualisiert wird, 
bzw. der µC, sobald er in der Schleife hängt, garnicht mehr ansprechbar 
ist.

Obwohl ich der Meinung bin, daß der serielle Empfang mittels Interrupt 
funktioniert, aber ganz sicher bin ich mir nicht:

Config Serialin = Buffered , Size = 10 , Bytematch = 13

Sub Serial0charmatch()
   Input Incoming_data Noecho
   I = 1
End Sub

Außerhalb meiner Endlosschleife funktioniert es, nur mit dem Ausstieg 
daraus nicht.

Hat jemand eine Idee ?

Gruß Tilmann

von Joerg (Gast)


Lesenswert?

Tilmann schrieb:
> Obwohl ich der Meinung bin, daß der serielle Empfang mittels Interrupt
> funktioniert, aber ganz sicher bin ich mir nicht:
>
> Config Serialin = Buffered , Size = 10 , Bytematch = 13
>
> Sub Serial0charmatch()
>    Input Incoming_data Noecho
>    I = 1
> End Sub
>
> Außerhalb meiner Endlosschleife funktioniert es, nur mit dem Ausstieg
> daraus nicht.

Wundert mich, dass mit sowenig Code überhaupt was geht.

von Tilmann (Gast)


Lesenswert?

Mit so wenig Code geht wahrscheinlich nichts, es ist nur ein Ausschnitt, 
denn wenn ich hier alle 380 Zeilen reinstellen würde, hätte 
wahrscheinlich niemand Bock zu versuchen, Durchblick zu bekommen.

Ist das überhaupt ein Interrupt, was ich da mache ?
Wenn ich Interrupt nicht enable geht garnichts, daher vermute ich ...

Übrigens habe ich jetzt unter "I=1" auf meine Abbruchbedingung 
geschrieben, seither bricht die Schleife zuverlässig ab, wenn ich den 
Befehl zum zweiten mal schicke. Warum erst beim zweiten mal ... ?

von Hannes L. (hannes)


Lesenswert?

Tilmann schrieb:
> Input Incoming_data Noecho

Wenn ich mich nicht irre, ist Input blockierend...

UART-RX in Bascom mache ich meist so:
1
Onrxd:
2
  Incr Rix                              'Schreibposition im Array erhöhen
3
  Rx_buf(rix) = Udr                     'Empfangsbyte in Buffer legen
4
Return

Die Mainloop kann dann prüfen, ob der String bereits komplett ist 
(Anzahl der bereits empfangenen und "eingekellerten" Bytes oder Wert des 
zuletzt empfangenen Bytes, z.B. 13 für CR) und zwischendurch auch andere 
Dinge tun, die nichtblockierend (abweisend) organisiert werden sollten.

...

von Tilmann (Gast)


Lesenswert?

Hallo Hannes,

Dein Buffer ist ein normaler String, oder ?

Übrigens funktioniert es bei mir inzwischen auch beim ersten mal.
Ich hatte in die Schleife in der Subroutine noch eine extra-Anweisung 
drin, daß bei P=1 die Subroutine zu verlassen ist; diese habe ich 
rausgeworfen, denn der Wert für P war ja schon die Bedinung für die 
while-Schleife.
Jetzt geht es so wie es soll. Leider habe ich nicht verstanden, warum 
das alles nicht gleich wollte ...

Aber danke für Dein Beispiel mit dem Interrupt.

Gruß Tilmann

von Hannes L. (hannes)


Lesenswert?

Tilmann schrieb:
> Dein Buffer ist ein normaler String, oder ?

Nein, ist ein Array.
1
Dim Rx_buf(10)as Byte                   'Empfangsbuffer
2
Dim Rix As Byte                         'RX-Index
Kannst aber mittels Dim....Overlay auch einen String drüber legen.
Das war bei mir aber nicht nötig, da das Telegramm aus mehreren Bytes 
und Words bestand, die separat extrahiert wurden.

...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.