So, im Nachhinein betrachtet ohnehin klar:
Man muss/darf (wenn man INKEY() verwenden will) natürlich nur das speichern, was NICHT 0 ist. Als Endeerkennung einer Nachricht ist "0" wenig geeignet.
Wenn man z.b <CR> als Nachricht-Ende nimmt ( was Bascom-PRINT freiwillig tut, wenn man ihn nicht hindert), müsste die Receive-Schleife lauten:
Code:
DO
inchar= inkey(#2)
if inchar > 0
incr myidx
myarr(myidx) = inchar
end if
LOOP until inchar = 27
myarr(myidx) = 0 ' ev. ein String-ende aus dem <CR> machen
unter der Annahme, dass das Speichern nicht zu langsam ist. Müsst man ausrechnen, bis zu welcher baudrate es reicht.
Sonst ist wohl eher "INPUT #" oder GET # geeignet
Wen es interessiert, so sieht INKEY() von innen aus:
Code:
open comb.4:9600,8,n,1
L_0x00DE: ' delay 1/2 bit --------------------------
PUSH r24
PUSH r25
LDI r24,0x08
LDI r25,0x00
L_0x00E6:
SBIW r24,0x0001
BRNE L_0x00E6
POP r25
POP r24
RET
' inkey (#1) ---------------------------------
L_0x00F0:
SBIS 0x0016,4 ' check PortB.4
RJMP L_0x00F8 ' start
CLR r24 ' return 0
RET
L_0x00F8:
LDI r18,0x09 ' counter = 9 (8 + 1 )
L_0x00FA: ' loop until PortB.4 = 0
SBIC 0x0016,4 '
RJMP L_0x00FA
RCALL L_0x00DE ' delay 1/2 bit
L_0x0100:
RCALL L_0x00DE ' delay 1/2 bit
RCALL L_0x00DE ' delay 1/2 bit
CLC ' clear carry
SBIC 0x0016,4 ' PortB.4 = ?
SEC ' = 1---> set Carry
DEC r18 ' decr counter
BREQ L_0x0114 ' counter= 0 --> exit
ROR r24 ' shift carry into r24:r25
ROR r25
RJMP L_0x0100 ' next bit
L_0x0114:
RET ' R24 = inbyte (that's it)
Der Unterschied von Waitkey ist minimal
Code:
' waitkey (#1) ---------------------------------
L_0x00F0:
SBIS 0x0016,4 ' wait PortB.4 = 0
RJMP L_0x00F6 ' start
RJMP L_0x00F0 ' cont'd wait Das ist der einzige Unterschied
Lesezeichen