Bei meiner aktuellen Aufgabe muss ich eine Slave Applikation/Gerät,
realisiert mit dsPCI33, um einige Funktionen erweitern.
Meine Befürchtung, dass das, mittels DMA realisiertze RS232-Protokoll
anfällig gegen Versetzungen sein müsste, hat sich schnell bestätigt -
sowie ich die Slave-Applikation zu Debug-Zwecken anhalte und wieder
starte, hängt sich die Kommunikation auf. Beim Anhalten der
Slave-Applikation entdeckt die Master-Applikation/Gerät zunächst einen
Timeout und beginnt im 150ms-Takt ein fixes Pattern zu senden, z.B.::
'P', 'A', 'T', 'T', 'E', 'R', 'N', '\x0D', '\x03'
Beim Wiederstarten der Slave-Applikation empfängt diese zunächst eine
nicht
korrekt ausgerichtete Nachricht, geht ihrerseits in einen
Initialisierungszustand über, indem sie dann aber typischerweise für
"immer und ewig" eine versetzte Variante der erwarteten Nachricht
erhält, z.B.:
'\x0D', '\x03', 'P', 'A', 'T', 'T', 'E', 'R', 'N'
Da ich aus Kompatibilitätsgründen das Protokoll nicht verändern kann,
habe ich auf der Slave-Seite beim Empfang einer "misaligned" Nachricht
einen zusätzlichen Zustand eingefügt, in dem zunächst 50ms gewartet,
dann das Receive-Fifo mittles
1 | while (U1STAbits.URXDA)
|
2 | { unsigned int tmp;
|
3 | tmp = U1RXREG; // Receive Fifo loeschen
|
4 | }
|
gelöscht wird, bevor ich die Slave-Applikation in den
Initialisierungszustand schicke.
Das funktioniert häufig wie gewünscht, in vielleicht 10% der Fälle tritt
aber ein seltsames Problem auf - die enpfangenen Nachrichten bestehen
nur noch aus einem fixen Charakter, meist '\x03', seltener '\x0D', noch
seltener 'N' (die Wahrscheinlichkeit für das 'Auftreten eines Zeichens
aus der Menge {'P', 'A', 'T', 'T', 'E', 'R', 'N', '\x0D', '\x03'} könnte
stark von rechts nach links fallen).
Ich hab' keine Idee, wass da passiert und würde mich über "kreative"
Tipps freuen.