Jag ser oftast till att få en fungerande seriell port på ett system, det är mycket bra för att skriva ut meddelanden och värden i debugsyfte. Men jag försöker oftast att använda interruptstyrd utskrift varför en debug-utskrift inifrån en ISR kan låsa allt. Inte bra!
Alltså behövs en möjlighet att samla ihop sekvenserna i någon buffer och sedan skriva ut som vid lämpligt tillfälle. Och det har jag sedan gjort vid att deklarera:
Kod: Markera allt
#define USE_SEQUENCE true
#if USE_SEQUENCE
struct
{
_UWORD Input, Output, Intermediate;
_UBYTE Filled;
_UBYTE Buffer[100];
} Sequence;
void Sequence_Initiate(void)
{
Sequence.Input = 0;
Sequence.Output = 0;
Sequence.Filled = false;
}
int Sequence_Add(_UBYTE Data)
{
if(Sequence.Filled && (Sequence.Input == Sequence.Output)) return(false);
Sequence.Filled = true;
Sequence.Buffer[Sequence.Input++] = Data;
if(Sequence.Input >= sizeof(Sequence.Buffer)) Sequence.Input = 0;
return(true);
}
int Sequence_Check(void)
{ // Something to fetch?
if(Sequence.Filled) return(true);
return(false);
}
_UBYTE Sequence_Get(void)
{
_UBYTE Data;
if(!Sequence_Check()) return(false);
Data = Sequence.Buffer[Sequence.Output++];
if(Sequence.Output >= sizeof(Sequence.Buffer)) Sequence.Output = 0;
if(Sequence.Output == Sequence.Input) Sequence.Filled = false;
return(Data);
}
#endif
Kod: Markera allt
#if USE_SEQUENCE
if(Sequence_Check())
{
// Format printout as required
sprintf(Buffer, "\rSeq:%3u \r\n", Sequence_Get()); RS232_B_Send_Buffer((_UBYTE*)Buffer);
}
#endif // USE_SEQUENCE
#if USE_SEQUENCE
Sequence_Add(18); // Värdet ska såklart variera från punkt till punkt!
#endif // USE_SEQUENCE
Jag använder en byte för dessa koder då det räcker fint till mig, man kan såklart utöka om man behöver.
Det är i grunden bara en cirkulär buffer, mycket lik den jag använder vid interruptstyrd utskrift. Och nej, det är inte epokgörande - men det kan vara ett trevligt sätt att få koll på att t.ex. ett samspel av hårdvaru-interrupt samspelar rätt och man kan få en idé om var det går fel.
EDIT: Ser att första utläsning blir fel. Får fixa rätt version sen - men principen är OK tycker jag.
EDIT igen: nu fungerar mjukvaran rätt.