EmbDev.net

Forum: µC & Digital Electronics Writing strings to the UART


von Andreas H. (ahoesch)


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

: Edited by User
von stefanus (Guest)


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.

von Mark R. (stevestrong)


Rate this post
useful
not useful
It would be nice to see your timer settings clocking the UART0.
Quartz frequency? UART0 Baudrate?
What other tasks run in the background? Will the UART0 timer somehow 
re-configured or used for something else?

Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
No account? Register here.