📄 sci.c
字号:
/* for transmission */
SCI_D_Boolean_t transmitDataPending; /* status boolean */
SCI_D_Boolean_t * transmitDataPendingPtr = &transmitDataPending;
/* line buffer */
static char lineBuffer[STRBUF]; /* line buffer */
char * lineBufferPtr = lineBuffer; /* pointer to line buffer*/
SCI_D_Boolean_t readyFlag = SCI_D_FALSE; /* flag for while loop */
/*------------------------------------------------------------------*/
/* transmit welcome message */
/*------------------------------------------------------------------*/
itoa( rc, lineBuffer );
out_string(SCIPtr, "\r\n\nSCI Monitor Program ready... (error=");
out_string(SCIPtr, lineBuffer);
out_string(SCIPtr, ")\r\n\n");
/*------------------------------------------------------------------*/
/* Loop forever, echoing input */
/*------------------------------------------------------------------*/
for(;;)
{
/*------------------------------------------------------------------*/
/* Wait for a character to be received */
/*------------------------------------------------------------------*/
while (readyFlag == SCI_D_FALSE)
{
/* try to receive */
status = SCI_D_Receive ( SCIPtr, /* SCI base address */
receivePtr,/* pointer to return val */
statusPtr /* structure for status */
);
/* If an error code is returned, exit the program */
HANDLE_ERROR(status);
/* check reception status */
if ((statusPtr->receiveDataPending == SCI_D_TRUE) ||
(statusPtr->dataOverrun == SCI_D_TRUE) ||
(statusPtr->noiseDetected == SCI_D_TRUE) ||
(statusPtr->framingError == SCI_D_TRUE) ||
(statusPtr->parityError == SCI_D_TRUE) ||
(statusPtr->receiverActive == SCI_D_TRUE))
{
/* Did not successfully receive data, */
/* keep trying to receive */
}
else
{
/* successful reception, continue */
readyFlag = SCI_D_TRUE;
} /* end if-else */
} /* end while loop */
readyFlag = SCI_D_FALSE; /* reset readyFlag */
/*------------------------------------------------------------------*/
/* End program if a CTRL-D or ESC character was received */
/*------------------------------------------------------------------*/
if ((receiveVal == EOT) || (receiveVal == ESC))
{
out_string(SCIPtr, "\n\nGoodbye!\r\n\n");
/* disable transmitter and receiver */
/* Call SCI_D_ControlOperation with valid parameters */
status = SCI_D_ControlOperation(
SCIPtr, /* SCI base address */
SCI_D_DISABLE,/* disable transmitter */
SCI_D_DISABLE /* disable receiver */
);
/* break out of loop and go to end of function */
break;
} /* end if */
/*------------------------------------------------------------------*/
/* Copy character to line echo buffer */
/*------------------------------------------------------------------*/
*lineBufferPtr++ = (char)receiveVal;
/*------------------------------------------------------------------*/
/* Echo the character back through the transmitter */
/*------------------------------------------------------------------*/
status = SCI_D_Transmit( SCIPtr,
receiveVal,
transmitDataPendingPtr
);
/*------------------------------------------------------------------*/
/* If a carriage return character was received, echo the buffered */
/* line and reset line buffer. */
/*------------------------------------------------------------------*/
if (receiveVal == '\r')
{
out_string (SCIPtr, "\n"); /* echo line feed */
if (lineBufferPtr != lineBuffer + 1) /* non-empty line */
{
*lineBufferPtr++ = '\n'; /* add line feed to buffer */
*lineBufferPtr++ = EOS; /* add end of string char */
check_string(SCIPtr, lineBuffer);
}
lineBufferPtr = lineBuffer; /* reset buffer pointer */
} /* end if */
} /* end of for loop */
return (status);
}
/**********************************************************************
Name: out_string
Description: Send a string out through the SCI_D transmitter
Inputs: SCIptr (pointer to SCI_D base address)
str (character string to transmit)
Outputs: status (if passed, 0; else line number of the failure)
**********************************************************************/
static void out_string (pSCI_D_t SCIPtr, char * str)
{
/*------------------------------------------------------------------*/
/* declare local variables */
/*------------------------------------------------------------------*/
/* return codes */
SCI_D_ReturnCode_t status = SCI_D_ERR_NONE; /* return value */
/* for transmission */
SCI_D_Boolean_t transmitDataPending; /* status boolean */
SCI_D_Boolean_t * transmitDataPendingPtr = &transmitDataPending;
SCI_D_Boolean_t readyFlag = SCI_D_FALSE; /* flag for while loop */
SCI_D_Status_t statusVal;
pSCI_D_Status_t statusPtr = &statusVal; /* for status */
char * cp; /* string pointer */
/*------------------------------------------------------------------*/
/* Loop through string */
/*------------------------------------------------------------------*/
for (cp = str; *cp != EOS; cp++)
{
/*------------------------------------------------------------------*/
/* Wait for pending transmissions to complete */
/*------------------------------------------------------------------*/
while (readyFlag == SCI_D_FALSE)
{
status = SCI_D_GetStatus(SCIPtr,
statusPtr);
/* check transmission status */
if (statusPtr->transmitDataPending == SCI_D_TRUE)
{
/* can't transmit yet */
}
else
{
/* continue */
readyFlag = SCI_D_TRUE;
} /* end if-else */
} /* end while loop */
readyFlag = SCI_D_FALSE; /* reset readyFlag */
/*------------------------------------------------------------------*/
/* Transmit character */
/*------------------------------------------------------------------*/
status = SCI_D_Transmit(SCIPtr,
*cp,
transmitDataPendingPtr);
} /* end for loop */
} /* end out_string */
static int check_string(pSCI_D_t SCIPtr, char * str)
{
if( !strncmp(str, "leds", 4) )
{
out_string(SCIPtr, "performing leds... ");
leds();
out_string(SCIPtr, "done\r\n");
}
else if( !strncmp(str, "reset", 4) )
{
out_string(SCIPtr, "performing reset...\r\n");
_start();
}
else
{
out_string(SCIPtr, "unknown command: ");
out_string(SCIPtr, str);
}
}
void print2( char *str )
{
out_string( (pSCI_D_t)__MMC2107_SCI2, str );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -