Eine Möglichkeit ist den String im Hintergrund zu empfangen und INPUT nur dann aufzurufen, wenn das Zeilenende-Zeichen (&H0D) empfangen wurde.
Für den Hintergrundempfang gibt es bei BASCOM-AVR den Befehl SERIALIN (Schau dazu in der Hilfe nach). Da gibt es neues Feature, welches eine Anwenderroutine aufruft, wenn ein bestimmtes Zeichen (z.B. Zeilenende) empfangen wurde.
Diese Zeile legt einen Buffer von 80 Zeichen an, bindet die ISR-Routine ein, welche die Zeichen im Hintergrund empfängt und ruft Serial0CharMatch auf, wenn das Zeichen mit den ASCII-Code 13 (=Carriage Return/Zeilenende) empfangen wurde.Code:Config Serialin = Buffered , Size = 80 , ByteMatch = 13 Dim CR_Received as Byte
Nach dem Label Serial0CharMatch kann der Anwender einen Programmteil implementieren und mit RETURN abschließen, welcher die gewünschte Aktion beim Empfang des bestimmten Zeichens ausführt.
Da dieses aber in der Interruptroutine ausgeführt wird, sollte hier nur ein Flag (Byte CR_Reiceived ist 0 oder 1) gesetzt werden, welches dann in der Anwendung selbst abgefragt wird.
Zu beachten ist, dass in dieser Interrupt-Routine nur die Register r0, r16, r24, r25, r26 und r27 gerettet sind. Daher können in diesem Programmteil entweder nur diese Register verwendet werden oder die entsprechenden Register müssen zusätzlich mit PUSH/POP gerettet werden. Da diese Wertzuweisung CR_Received = 1 aber nur r24 verwendet, muss hier nichts weiter unternommen werden.Code:Serial0CharMatch: CR_Received = 1 return
Im Hauptprogramm kann wie in folgendem Code-Teil angeführt auf die Eingabe einer kompletten Zeile reagiert werden:
Code:' Hauptschleife DO ' anderer Programmcode '------------------------------------------------------------------ Disable Interrupts If Cr_received = 1 Then Cr_received = 0 ' ISR-Flag zurücksetzen Enable Interrupts Input EmpfangsString ' Nun kann der String weiterbehandelt werden Else Enable Interrupts ' Keine Zeilenende, Interrupt wieder einschalten End If '------------------------------------------------------------------ ' anderer Programmcode LOOP End
Damit die Interrupt-Routine und das Hauptprogramm nicht gleichzeitig das Flag CR_Received ändern, wird hier während der Abfrage und Änderung der Interrupt gesperrt.
Noch eine Bemerkung:
Der in Serialin definierte Empfangsbuffer muss natürlich die Länge der längsten Eingabezeile (plus einige Reservebytes) haben.







Zitieren

Lesezeichen