Please note: We are aware of an issue affecting replies on the Arm Community forums, which may not be loading as expected.

We apologize for any inconvenience and appreciate your patience while we investigate and work to resolve the issue.

Thank you for your understanding.


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
  • HI.

    i have tidyed yo're code.

    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;
    }
    
    
      TI=TRUE; /* always set TI=1 initially to allow serial printing */
      RI=0;
    
      loop: //
      RI=0; //IDLE
    
      while ((1))
        ;
    
      goto loop;
    }
    

    they're a lot of things wrong.

    the bigest i think is yo're interrupt. it gets called when they're is one char from uart. but you call 'gets" to get more char's. where do u think they will come from?

    u must change yo're isr to collect the char's. one at a time.

    also u must clear ri if it is set. not evry time.

    r u using tx anywear? if u do not then u do not set ti.

    Alway's yo're freind.

    Zeusti.

Reply
  • HI.

    i have tidyed yo're code.

    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;
    }
    
    
      TI=TRUE; /* always set TI=1 initially to allow serial printing */
      RI=0;
    
      loop: //
      RI=0; //IDLE
    
      while ((1))
        ;
    
      goto loop;
    }
    

    they're a lot of things wrong.

    the bigest i think is yo're interrupt. it gets called when they're is one char from uart. but you call 'gets" to get more char's. where do u think they will come from?

    u must change yo're isr to collect the char's. one at a time.

    also u must clear ri if it is set. not evry time.

    r u using tx anywear? if u do not then u do not set ti.

    Alway's yo're freind.

    Zeusti.

Children