Owner manual

38 Troubleshooting
Troubleshooting
/* Update Tx queue In index */
q[Dev].TxIn = In;
asm sti; /* enable interrupts */
return(NumOpen);
}
/********************************************************
Function: DeqRxData
Purpose: Remove data from a Rx queue.
Call: DeqRxData(Dev,Buf,Cnt)
int Dev; Device number
unsigned char *Buf;
Buffer takes data removed from Rx queue.
int Cnt; Count of bytes to remove
Return: int: Number of bytes removed from Rx queue
*/
int DeqRxData(int Dev,unsigned char *Buf,int Cnt)
{
int i; /* balance of bytes to copy after q wrap */
int Out; /* Out index into Rx buffer */
int BCnt; /* count of bytes copied */
asm cli; /* no interrupts until done, do not want
periodic event function modifying q
while we are working on it */
Out = q[Dev].RxOut;/* local copy of Out index */
/* Get number of bytes in Rx buffer */
if((BCnt = q[Dev].RxIn - Out) < 0)
BCnt += RXBUF_SIZE; /* adjust for queue wrap */
else if(BCnt == 0)
return(BCnt); /* nothing in Rx buffer */
if(Cnt < BCnt)
BCnt = Cnt; /* do not move more than asked for */
i = BCnt - (RXBUF_SIZE - Out); /* i = whats left after wrap around */
if(i < 0)
i = 0;
/* Copy to end of Rx buffer */
memcpy(Buf,&q[Dev].RxBuf[Out],BCnt - i);
/* Updata Out index, point to beginning of buffer if already at end of it */
Out = (Out + (BCnt - i)) % RXBUF_SIZE;
/* Copy the rest of the buffer, if any left */
if (i != 0)
{
memcpy(&Buf[BCnt - i],q[Dev].RxBuf,i);
Out = i;
}
/* Update Rx queue Out index */
q[Dev].RxOut = Out;
asm sti; /* enable interrupts */
return(BCnt);
}
/********************************************************
Function: EvRxData
Purpose: Receive event function, read data from a serial device
and add it to a Rx queue.
Call EvRxData(Dev)
int Dev; Device number
Return: void
*/
void EvRxData(int Dev) /* receive event function */
{
int i; /* balance of bytes to copy after q wrap */
int NumOpen; /* num bytes open in Rx buffer */
int In; /* In index into Rx buffer */
int Cnt; /* total count of bytes read */
In = q[Dev].RxIn; /* local copy of In index */
/* Get number bytes open in Rx buffer */
if((NumOpen = q[Dev].RxOut - In - 1) < 0)
NumOpen += RXBUF_SIZE; /* adjust for q wrap */
if(NumOpen == 0)
return; /* no room in Rx buffer */
i = NumOpen - (RXBUF_SIZE - In); /* i = whats left after wrap around */
if (i < 0)
i = 0;
/* Read data in up to end of Rx buffer */
Cnt = aaRead(Dev,NumOpen - i,&q[Dev].RxBuf[In]);
/* Update In index, point to beginning of buffer if already at end of it */
In = (In + Cnt) % RXBUF_SIZE;