Hallo,
ich habe hier einen Effekt, den ich nicht verstehe. Wahrscheinlich mache ich, wie immer, etwas falsch. Aber ich finde nichts, darum frage ich hier.
Ich habe eine serielle Empfangsroutine, die in einen global dekalrierten Puffer schreibt, mit einer ebenfalls global deklarierten Zählvariable CommPointer.
if CommFlag = StartChar then //Vorher schon gültiges Startzeichen empfangen?
inc(CommPointer); // dann im Buffer ablegen
b:= SerInp;
RecvBuffer[CommPointer]:= b;
write(serout4, bytetostr(b));
...
Es ist keine Interruptroutine, es gibt auch keine von mir deklarierten Interrupts, kein Multitasking.
Jetzt das Verhalten, was ich nicht verstehe:
Ist die Variable CommPointer (Byte) im $DATA Bereich deklariert, funktioniert das write(serout..) einwandfrei. Habe ich die Variable CommPointer jedoch im $IDATA Bereich, bekome ich keine Ausgabe von ByteToStr.
Schreibe ich jedoch
write(serout4, IntToStr(word(b)));
funktioniert die Ausgabe auch mit CommPointer im $IDATA Bereich.
Im Simulator tritt dieser Effekt nicht auf, dort sehe ich auf dem Terminal immer korrekte Daten, egal, ob $DATA oder $IDATA.
Ich habe nun ziemlich lange "gefummelt", bis ich das Verhalten soweit eingegrenzt habe.
Der Effekt muss mit ByteToStr zu tun haben. Denn die Variable b hat den richtigen Wert, dieser wird auch mit serout(b) korrekt übertragen.
Hat jemand eine Idee, was ich falsch mache?
Viele Grüße, Rolf
ich habe hier einen Effekt, den ich nicht verstehe. Wahrscheinlich mache ich, wie immer, etwas falsch. Aber ich finde nichts, darum frage ich hier.
Ich habe eine serielle Empfangsroutine, die in einen global dekalrierten Puffer schreibt, mit einer ebenfalls global deklarierten Zählvariable CommPointer.
Code
if CommFlag = StartChar then //Vorher schon gültiges Startzeichen empfangen?
inc(CommPointer); // dann im Buffer ablegen
b:= SerInp;
RecvBuffer[CommPointer]:= b;
write(serout4, bytetostr(b));
...
Es ist keine Interruptroutine, es gibt auch keine von mir deklarierten Interrupts, kein Multitasking.
Jetzt das Verhalten, was ich nicht verstehe:
Ist die Variable CommPointer (Byte) im $DATA Bereich deklariert, funktioniert das write(serout..) einwandfrei. Habe ich die Variable CommPointer jedoch im $IDATA Bereich, bekome ich keine Ausgabe von ByteToStr.
Schreibe ich jedoch
Code
write(serout4, IntToStr(word(b)));
funktioniert die Ausgabe auch mit CommPointer im $IDATA Bereich.
Im Simulator tritt dieser Effekt nicht auf, dort sehe ich auf dem Terminal immer korrekte Daten, egal, ob $DATA oder $IDATA.
Ich habe nun ziemlich lange "gefummelt", bis ich das Verhalten soweit eingegrenzt habe.
Der Effekt muss mit ByteToStr zu tun haben. Denn die Variable b hat den richtigen Wert, dieser wird auch mit serout(b) korrekt übertragen.
Hat jemand eine Idee, was ich falsch mache?
Viele Grüße, Rolf