Skip to main content
Visitor II
July 16, 2020
Question

Receive a string 9 chars long through UART1

  • July 16, 2020
  • 2 replies
  • 1009 views

I would like to receive a string through the UART1,

its format is from 000000000 to 999999999,

However when I send the string only the first object is read and it is repeated nine times and the other values are lost.

I am using this function to read the data from UART

void Serial_read_char(uint8_t * buf, uint8_t numberOfBytes)
{
		buf[pos] = UART1_ReceiveData8();
		
		UART1_ClearITPendingBit(UART1_IT_RXNE);
		UART1_ClearFlag(UART1_FLAG_RXNE);
		
		pos++;
		
		if(pos > numberOfBytes)
		{
			pos = 0;
		}
 }

And this is how I am storing the data in the main function

		if (UART1_GetFlagStatus(UART1_FLAG_RXNE) == TRUE) 
		{
			Serial_read_char(buf, 9);
			delay_ms(1);
			
			get_lux = (*(buf+0) - 0x30)*100+
								(*(buf+1) - 0x30)*10 +
								(*(buf+2) - 0x30);
								
			get_warm =(*(buf+3) - 0x30)*100+
								(*(buf+4) - 0x30)*10 +
								(*(buf+5) - 0x30);
								
			get_cool =(*(buf+6) - 0x30)*100+
								(*(buf+7) - 0x30)*10 +
								(*(buf+8) - 0x30);
		}

How could I read correctly the value from the String?

I am using the STM8S208C6 and the Cosmic compiler free

    This topic has been closed for replies.

    2 replies

    Technical Moderator
    July 20, 2020

    Please double-check your routines.

    Where did you set the value of pos before calling Serial_read_char?

    You are calling Serial_read_char with a parameter of 9 for the number of characters and you also reset the pos counter in that routine... but where is the loop to read the byte(s) there?

    Good luck!

    /Peter

    GGhed.1Author
    Visitor II
    July 20, 2020

    @Peter BENSCH​ , thank you for the answer.

    I was reading some forums about this issue and I notice that one solution was to use interrupt everytime that my system receives any data from the UART1.

    I applied it into my code and it is working quite well.

    This was the solution, I hope that it can help someone else that face the same problem:

    extern unsigned char buf[9];
    unsigned int pos = 0;
     
    extern int get_lux;
    extern int get_warm;
    extern int get_cool;
     
    #ifdef _COSMIC_
    @far @interrupt void UART1_RX_IRQHandler(void)
    #else /* _RAISONANCE_ */
    void UART1_RX_IRQHandler(void) interrupt 18
    #endif /* _COSMIC_ */
     
    {
     buf[pos] = UART1_ReceiveData8();
    	UART1_ClearITPendingBit(UART1_IT_RXNE);
    	UART1_ClearFlag(UART1_FLAG_RXNE);
     
    	if (pos >= 8)
    	{
    		get_lux = ((buf[0]) - 0x30 )*100+
    			 ((buf[1]) - 0x30 )*10 +
    		 ((buf[2]) - 0x30 );
     
    		get_warm =((buf[3]) - 0x30 )*100+
    		 ((buf[4]) - 0x30 )*10 +
    		 ((buf[5]) - 0x30 );
    	
    		get_cool =((buf[6]) - 0x30 )*100+
    		 ((buf[7]) - 0x30 )*10 +
    			 ((buf[8]) - 0x30 );
    		pos = 0;
    	}
     
    	pos++;
    }