Hallo Thorsten,
ich denke du bist der einzige der das beantworten kann.
Ich habe gestern was programmiert und bin auf einen Effekt gestossen, den ich mir nicht erklären kann.
Szenario: es kommt ein Sysex-String herein:
F0 00 01 0F 12 41 42 43 44 7F
Dieser wird durch Verschachtelte Funktionaufrufe innerhalb
void MPROC_NotifyReceivedByte(unsigned char byte) __wparam
gepased:
Innerhalb MPROC_NotifyReceivedByte wird die eigene Funktion intercom_scan(byte) aufgerufen, welche den “Befehl” 0x12 == debug printing erkennt und ab dem 6.byte
display_scan(byte) aufruft. (“Befehl” 0x13 ist debug printing fortsetzen)
void display_scan(unsigned char byte){
switch (intercom_command){
case 0x12: //bei ersten Mal Cursor setzen und Display löschen
if (intercom_count == 6) {
MIOS_LCD_CursorSet(0xc0);
MIOS_LCD_PrintCString(" ");
MIOS_LCD_CursorSet(0xc0);
}
case 0x13: MIOS_LCD_PrintChar(byte);
MIOS_LCD_MessageStart(255);
}
}
Was das soll, sollte ersichtlich sein: Ich möchte eine Debugausgabe in Zeile 0xc0 starten und über mehrere Sysex-Strings fortsetzen. Und jedesmal wenn ein weiteres Byte ankommt den MIOS_MESSAGE_CTR zurücksetzen.
Das klappt aber so nicht.
Denn es wird immer nur genau auf die erste Stelle geprintet, so als ob vor jedem Aufruf von MIOS_LCD_PrintChar(byte); immer ein MIOS_LCD_CursorSet(0xc0);
aufgerufen wird.
Im Display steht dann in der letzten Zeile immer ein “D”. (das letzte zu druckende Byte aus dem Sysexstring) und nicht wie erwartet “ABCD”.
Wenn ich aber direkt zweimal MIOS_LCD_PrintChar(byte); hintereinander aufrufe erhalte ich “DD”.
Wie ein Workaround auszusehen hat ist trivial, aber könntest du mir bestätigen dass dieses Verhalten so ok ist? MIOS_LCD_PrintChar(byte); macht ja nicht viel. Ich erkenne nirgends im MIOS-Code, dass der Cusor implizit gesetzt wird.
Gruß Thomas, die letzten Feinheiten programmierend.