This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Serial Rx problem

I have a strange problem in my code. I cannot receive characters via the serial port.

I've read up on the TI and RI interrupts and I think I am handling these correctly.

The program goes to the serial I/O isr, but just sits at the gets(comin,4) line. When I examine comin in the watch window and input chars via the SIN = xx (where xx is an ascii code), I can see the comin array remains empty.

Below is the serial I/O interrupt routine (my application does not need Tx)

pre
void uart_rx_isr (void) interrupt 4 using 3
{ signed char index=0; EA=0;

if (RI == 1) { gets(comin,4); command = atoi(comin); } RI=FALSE; /* finished isr - clear flag */ TI=FALSE; /* TI will not be used - always clear it*/ EA=1;
}

/pre

Here is a fragment from main() - you can see that I set TI=1 initially to set the UART up

pre

TI=TRUE; /* always set TI=1 initially to allow serial printing */ RI=0;

loop: //RI=0; //IDLE

while ((1));

goto loop;
} /pre

Appreciate some pointers here.

Jason

Parents
  • /*------------------------------------------------*/
    /* Interrupt service  routine to handle  the  Rx  input  which comes in via RxD on pin 11 */
    /* of the 89LPC922 */
    void uart_rx_isr (void) interrupt 4 using 3
    {
            int index=0;
            EA=0;
            if (RI==1)  /* if  RI  is  set  then  execute   the  RxD routine,  else jump over and exit*/
    
            do
            {
            comin[index] = (getchar());
            index++;
            }
            while (index<4);
            RI = FALSE;/* clear the  RI interrupt flag and exit */
            EA=1;
    }
    /*---------------------------------------------*/
    
    <PRE/>
    
    This  works!
    
    
    

Reply
  • /*------------------------------------------------*/
    /* Interrupt service  routine to handle  the  Rx  input  which comes in via RxD on pin 11 */
    /* of the 89LPC922 */
    void uart_rx_isr (void) interrupt 4 using 3
    {
            int index=0;
            EA=0;
            if (RI==1)  /* if  RI  is  set  then  execute   the  RxD routine,  else jump over and exit*/
    
            do
            {
            comin[index] = (getchar());
            index++;
            }
            while (index<4);
            RI = FALSE;/* clear the  RI interrupt flag and exit */
            EA=1;
    }
    /*---------------------------------------------*/
    
    <PRE/>
    
    This  works!
    
    
    

Children