Writing strings to the UART

OP #3908487
Rate this post
useful
not useful
Hi all,

I am programming an ATMEGA2560 and am trying to send strings via UART0. 
Sending single characters works,
1
void serial_writeChar0(unsigned char c)
2
  {
3
   while ( !(UCSR0A & (1 << UDRE0)) );
4
   UDR0 = c;
5
  }
6

7
but sending a complete string
8

9
void serial_writeString0(const char *s)
10
  {
11
  while (*s)
12
    {
13
      serial_writeChar0(*s);
14
      s++;
15
    }
16
  }
17

18
while (1)
19
  {
20
   serial_writeChar0('A');
21
   serial_writeChar0('B');
22
   serial_writeChar0('C');
23
   serial_writeChar0('\n');
24

25
   serial_writeString0("Some String");
26
   delay_ms(500);
27
  }
produces dirt on the terminal.
1
SÿÿÿÿÿÿÿÿÿÿÿABC
2
SÿÿÿÿÿÿÿÿÿÿÿABC
3
SÿÿÿÿÿÿÿÿÿÿÿABC
4
SÿÿÿÿÿÿÿÿÿÿÿABC
5
SÿÿÿÿÿÿÿÿÿÿÿABC
6
SÿÿÿÿÿÿÿÿÿÿÿABC
What the heck could be the problem?

Thanks a lot in advance!!

Andreas
Guest #3908513
Rate this post
useful
not useful
Maybe the bitrate is not accurate enough. The R/C oscillator is not 
recommended for serial ports and some combinations of bitrates and 
chrystal also dont work stable. The datasheet contains tables with 
recommended combinations.

Another problem cause might be not matching number of stop bits on the 
two ends of the cable.

Instead of the while loop, I usually write:

loop_until_bit_is_set(UCSR0A, UDRE0);

I'm not usre if that makes any difference. Possibly not, but it's worth 
to try.

Reply

Please log in before posting.

or

Log in with Google account

Registration is free and takes only a minute.

Register now