beautypg.com

Comtrol API (6508) for the MS-DOS User Manual

Page 38

background image

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;