Jap, wie ich eben schon schrieb.![]()
Jap, wie ich eben schon schrieb.![]()
Besten Dank jetzt funktioniert esaber dafür hab ich jetzt die nächste Frage:
Wieso empfang in nach dem Strings immer 4 mal 0xff, bevor das Linefeed kommt?
Hört sich nach konstantem String ( also char buffer[20] ) an, wo der nicht voll ist bzw.
Endet bei \0 und wenn er den nicht findet geht er bis zum Schluss durch.Code:void uart_write(char *s){ while(*s) { uart_send(*s); s++; } }
Besten Dank nun funktioniert auch das richtig.
Jetzt hätte ich aber noch 2 Fragenkomm mir schon langsam unverschämt vor euch so zu löchern.
1: Was bedeutet genau [20] und muss ich das auch ändern?
2: Wenn ich ein LF stetzen will kann ich doch mit HTerm auf die \0 triggern, so dass hterm einen neuen Zeile beginnt. Doch leider funktioniert das bei mir nicht mein Favorit war ja bei HTerm auf "New line at Null " stelle doch irgendwie geht das bei keiner opiton richtig.
Das [20] bei char[20] definiert die Länge eines Arrays vom Typ char.
\0 ist nur das Null-Zeichen aus dem ASCII-Standard. Das wird benutzt um das Ende eines String (Zeichenkette) oder eines Arrays ( auch eine Zeichenkette wenn vom Typ char) zu erkennen.
Sprich irgendwann hat man sich darauf geeinigt, dass \0 die Zeichenfolge abschließt. Was aber nicht automatisch heisst, dass eine Zeile auch beendet wird. Das macht man je nach System mit einer Variation von \r oder \n, also Linefeed und Carriage-Return.
Versuch doch mal mittels deiner UART Funktion das Folgende :uart_write ("Hallo\r\n") und stell bei hterm als Zeilenende CR+LF ein.
Grüße,
Daniel
Genau so hab ich es auch im Tutorial gelesen mit \r \n.
Aber leider funktioniert es nicht. Ich hab jetzt eine Delay von 1 sec mit ein gebaut, dass ich es besser sehen kann. Das Funktioniert einwandfrei.
Nur eben das Linefeed nicht.
#include <avr/io.h>
#include <stdio.h>
#define F_CPU 3686400UL
#include <util/delay.h>
#define Baud 38400
#define CR "\0\r\n"
void uart_init(void)
{
UCSRB = (1 << TXEN);
UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
UBRRL=0x05; // Baudrate festlegen
UBRRH=0x00; // Baudrate festlegen
}
int uart_send(unsigned char c)
{
while (!(UCSRA & (1<<UDRE)))
{
// mach nichts
}
//senden
UDR=c;
return 0;
}
void uart_write(char *s)
{
while(*s)
{
uart_send(*s);
s++;
}
}
int main(void)
{
uart_init();
while(1==1)
{
uart_write("Das ist ein Test" CR);
_delay_ms(1000);
}
}
Nicht
sondern :Code:uart_write("Das ist ein Test" CR);
Das #define CR "\0\r\n" zusammen mit zeichenkette+zeichenkette geht in die Hose. Da du letzendlich versuchst eine Adresse mit einer Konstanten zu addieren.Code:uart_write("Das ist ein Test\r\n");
Grüße,
Daniel
Lesezeichen