sebschill
23.11.2009, 15:08
Hallo Leute,
ich brauch mal eure Hilfe. Ich habe ein MEGA 32 und möchte mit ihn Strings empfangen Ich verwende dazu die uart.h von der RN Seite. Das Senden von date funktionert mit dem beispielcode in etwas veränderter Form.
Ich habe das Problem das er beim Empfangen von einem Zeichen, den Wert des UDR nicht an die Funktion zurück gibt. Und damit ergibt sich das Problem das ich den String dann nicht zusammen setzen kann.
So ich stelle mal den Code rein und die Header datei.
#include <ctype.h> //Zeichen-Umwandlungs-Makros und ctype Makros
#include <inttypes.h> //Einbinden von Interrupts
#include <setjmp.h> //libc unterstützt setjmp() und longjmp(), um direkt in eine andere (nicht-lokale) Funktion zu springen.
#include <stdint.h> //??? könnte zum initalisieren von Variablen sein oder so
#include <stdio.h>
#include <stdlib.h> //Deklariert grundlegende ISO C-Makros und -Funktionen sowie einige AVR-spezifische Erweiterungen
#include <string.h> //ermöglicht String optionen
#include <uart.h> //Einbinde der Schnittstelle Funktionen
#include <avr/delay.h> //Einbinden der Verzörgerungsdatei
#include <avr/interrupt.h> // Wird nur gebraucht bei der Interrupt-Version
#include <avr/io.h> //Einbinden der Portpins und des richtigen µC, µC muß noch definiert werden
#include <avr/iom32.h>
#include <avr/wdt.h>
//************************************************** *********************************
#define __AVR_ATmega32__ //µC MEGA 32 eingestellt
#ifndef F_CPU
#define F_CPU 8000000UL /* Quarz mit 8 Mhz, #warning "F_CPU war noch nicht definiert, wird nun mit 3686400 definiert" */
#endif
#define BAUDRATE 38400UL //Definition als unsigned long, sonst gibt es Fehler in der Berechnung
#define CR "\r\n" // Ein Zeilenumbruch, abhängig, was die Gegenstelle haben will bei Windows: "rn", Linux : "n", MacOS : "r"
//************************************************** *********************************
// Variablen|Strings|USW.
//************************************************** *********************************
char text[] = "Das_ist_deine_Eingabe!!"CR; // Text String
char empfangene_daten[20]; // Text String, 20 Zeichen, Empf. USART
char *pt_empfangene_daten; // Zeiger auf die erste Adresse der Variablen empfangenen_daten
//************************************************** *********************************
//Innitalisierungfunktion der seriellen Schnitstelle
//************************************************** *********************************
void uart_init()
{
uint16_t ubrr = (uint16_t) ((uint32_t) F_CPU/(16*BAUDRATE) - 1);
UBRRH = (uint8_t) (ubrr>>8);
UBRRL = (uint8_t) (ubrr);
// UART Receiver und Transmitter anschalten
// Data mode 8N1, asynchron
UCSRB = (1 << RXEN) | (1 << TXEN);
UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
// Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte)
do
{
UDR;
}
while (UCSRA & (1 << RXC));
}
//************************************************** ********************************
// Einen 0-terminierten String übertragen.
//************************************************** ********************************
void uart_puts (const char *s)
{
do
{
uart_putc (*s);
}
while (*s++);
}
//************************************************** ********************************
//Irgendetwas lesen
//************************************************** ********************************
void uart_gets_wait ()
{
pt_empfangene_daten = &empfangene_daten[0];
for(;;)
{
*pt_empfangene_daten = uart_getc_wait();
pt_empfangene_daten++; //zählt pointer pt1 hoch, setz damit Adresse im Array ein weiter
}
}
//************************************************** ********************************
//Hauptprogramm
//************************************************** ********************************
int main()
{
uart_init();
for (;;)
{
//uart_puts ("Los"CR);
uart_gets_wait(); //daten der vom RS232 lesen
//uart_puts (empfangene_daten); //Unter Variablen "text" hinterlegten wert senden
}
}
Viele danke für eure Hilfe
ich brauch mal eure Hilfe. Ich habe ein MEGA 32 und möchte mit ihn Strings empfangen Ich verwende dazu die uart.h von der RN Seite. Das Senden von date funktionert mit dem beispielcode in etwas veränderter Form.
Ich habe das Problem das er beim Empfangen von einem Zeichen, den Wert des UDR nicht an die Funktion zurück gibt. Und damit ergibt sich das Problem das ich den String dann nicht zusammen setzen kann.
So ich stelle mal den Code rein und die Header datei.
#include <ctype.h> //Zeichen-Umwandlungs-Makros und ctype Makros
#include <inttypes.h> //Einbinden von Interrupts
#include <setjmp.h> //libc unterstützt setjmp() und longjmp(), um direkt in eine andere (nicht-lokale) Funktion zu springen.
#include <stdint.h> //??? könnte zum initalisieren von Variablen sein oder so
#include <stdio.h>
#include <stdlib.h> //Deklariert grundlegende ISO C-Makros und -Funktionen sowie einige AVR-spezifische Erweiterungen
#include <string.h> //ermöglicht String optionen
#include <uart.h> //Einbinde der Schnittstelle Funktionen
#include <avr/delay.h> //Einbinden der Verzörgerungsdatei
#include <avr/interrupt.h> // Wird nur gebraucht bei der Interrupt-Version
#include <avr/io.h> //Einbinden der Portpins und des richtigen µC, µC muß noch definiert werden
#include <avr/iom32.h>
#include <avr/wdt.h>
//************************************************** *********************************
#define __AVR_ATmega32__ //µC MEGA 32 eingestellt
#ifndef F_CPU
#define F_CPU 8000000UL /* Quarz mit 8 Mhz, #warning "F_CPU war noch nicht definiert, wird nun mit 3686400 definiert" */
#endif
#define BAUDRATE 38400UL //Definition als unsigned long, sonst gibt es Fehler in der Berechnung
#define CR "\r\n" // Ein Zeilenumbruch, abhängig, was die Gegenstelle haben will bei Windows: "rn", Linux : "n", MacOS : "r"
//************************************************** *********************************
// Variablen|Strings|USW.
//************************************************** *********************************
char text[] = "Das_ist_deine_Eingabe!!"CR; // Text String
char empfangene_daten[20]; // Text String, 20 Zeichen, Empf. USART
char *pt_empfangene_daten; // Zeiger auf die erste Adresse der Variablen empfangenen_daten
//************************************************** *********************************
//Innitalisierungfunktion der seriellen Schnitstelle
//************************************************** *********************************
void uart_init()
{
uint16_t ubrr = (uint16_t) ((uint32_t) F_CPU/(16*BAUDRATE) - 1);
UBRRH = (uint8_t) (ubrr>>8);
UBRRL = (uint8_t) (ubrr);
// UART Receiver und Transmitter anschalten
// Data mode 8N1, asynchron
UCSRB = (1 << RXEN) | (1 << TXEN);
UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
// Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte)
do
{
UDR;
}
while (UCSRA & (1 << RXC));
}
//************************************************** ********************************
// Einen 0-terminierten String übertragen.
//************************************************** ********************************
void uart_puts (const char *s)
{
do
{
uart_putc (*s);
}
while (*s++);
}
//************************************************** ********************************
//Irgendetwas lesen
//************************************************** ********************************
void uart_gets_wait ()
{
pt_empfangene_daten = &empfangene_daten[0];
for(;;)
{
*pt_empfangene_daten = uart_getc_wait();
pt_empfangene_daten++; //zählt pointer pt1 hoch, setz damit Adresse im Array ein weiter
}
}
//************************************************** ********************************
//Hauptprogramm
//************************************************** ********************************
int main()
{
uart_init();
for (;;)
{
//uart_puts ("Los"CR);
uart_gets_wait(); //daten der vom RS232 lesen
//uart_puts (empfangene_daten); //Unter Variablen "text" hinterlegten wert senden
}
}
Viele danke für eure Hilfe