⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sci.c

📁 摩托罗拉MMC2107在ucosII的移植代码
💻 C
📖 第 1 页 / 共 2 页
字号:
  /* 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 + -