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.
Code:
Config Serialin = Buffered , Size = 80 , ByteMatch = 13
Dim CR_Received as Byte
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.
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.
Code:
Serial0CharMatch:
CR_Received = 1
return
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.
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.
Lesezeichen