Ne
Leider sind es nicht nur die Umbrüche. Wenn du dir mal die gewollte ausgabe (1.) anschaust, siehst du dass die Daten auch gut für Menschen lesbar sind, mit Datum und dann 3 Werte getrennt durch einen |. Das ist leider bei der 2. Variante nicht der Fall.
Zum senden vom Robo aus, benutze ich die Funktionen aus dem RN Wiki + Asuro PrintInt sieht dann zusammen so aus:
uart.c
Code:
/*
UART Funktionen
*/
#include <avr/io.h>
#include "uart.h"
#include <stdlib.h>
#define UART_BAUD_RATE 9600
#define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC) ((F_CPU)/((UART_BAUD_RATE)*16L)-1)
void uart_init()
{
UBRRH=(uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_CPU)>>8);
UBRRL=(uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_CPU);
// UART Receiver und Transmitter anschalten
// Data mode 8N1, asynchron
UCSRB = (1 << RXEN) | (1 << TXEN);
UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
// Flush Receive-Buffer
do
{
unsigned char dummy;
(void) (dummy = UDR);
}
while (UCSRA & (1 << RXC));
}
void uart_puts (const char *s)
{
do
{
uart_putc (*s);
}
while (*s++);
}
/*Gibt einen Integer über die UART Schnittstelle aus*/
void PrintInt(int a){
char temp[10];
itoa(a,temp,10);
uart_puts(temp);
}
/*Übernommen und abgewandelt aus der Asuro Lib 2.6
ACHTUNG: In *data muss eine Platz mehr sein, als die Zeichenkette! (/0 Zeichen)
*/
void SerRead(unsigned char *data, unsigned char length,unsigned int timeout)
{
unsigned char i = 0;
unsigned int time = 0;
if (timeout != 0) {
while (i < length && time++ < timeout) {
if (UCSRA & (1 << RXC)) {
data[i++] = UDR;
time = 0;
}
Msleep(10);
}
if (time > timeout) data[0] = 'T';
}
/* blocking */
else {
while (i < length) {
if (UCSRA & (1 << RXC))
data[i++] = UDR;
}
}
data[length] = 0;
}
uart.h
Code:
/*
Header für uart.c
------------------------
Johannes Kreuzer - 2006
*/
#ifndef _UART_H_
#define _UART_H_
#include <avr/io.h>
extern void uart_init(void);
extern void Msleep(int dauer);
static inline void uart_putc (const char c)
{
while (!(UCSRA & (1 << UDRE)))
;
UDR = c;
}
static inline int uart_getc_wait(void)
{
while (!(UCSRA & (1 << RXC)))
;
return (int) UDR;
}
static inline int uart_getc_nowait(void)
{
return (UCSRA & (1 << RXC)) ? (int) UDR : -1;
}
#endif /* _UART_H_ */
/*Sendet einen String*/
void uart_puts (const char *s);
void PrintInt(int a);
void SerRead(unsigned char *data, unsigned char length,unsigned int timeout);
Andun
Lesezeichen