Gast
#617157
Hallo,
ich habe ein problem mit dem puffer verwaltung. mein programm soll daten
via ein puffer empfangen und die daten werden im Puffer abgeholt und im
bildschirm (Hyperterminal)gesendet. ich habe schon das programm ohne
verwaltung des puffer geschrieben und es functionniert prima aber mit
dem puffer habe ich einige probleme. es functionniert nicht so richtig
mein programm sendt immer daas selbe zeichen unendlich obwohl ich
mehrere zeichen im puffer gesendet habe. untern ist meine Quellecode
kannt jemand durchschaut und mir sagen wo kann das problem sein
MFG
jean
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
/* ATmega with one USART */
#define ATMEGA_USART
#define UART0_RECEIVE_INTERRUPT SIG_UART_RECV
#define UART0_TRANSMIT_INTERRUPT SIG_UART_DATA
#define UART0_STATUS UCSRA
#define UART0_CONTROL UCSRB
#define UART0_DATA UDR
#define UART0_UDRIE UDRIE
/*Size of the circular Transmit buffer, must be power of 2*/
#ifndef UART_TX_BUFFER_SIZE
#define UART_TX_BUFFER_SIZE 32
#endif
// CHECK F_CPU WITH HARDWARE OSZILLATOR SETTING !!!!
#define F_CPU 1000000UL
#define UART_BAUD 9600
/*
* module global variables
*/
int g_idx;
int MAX_BUFFER_SIZE;
MAX_BUFFER_SIZE=UART_TX_BUFFER_SIZE;
unsigned char Buf[UART_TX_BUFFER_SIZE];
int bxoff = 0;
unsigned char c;
void uart_init(void);
unsigned int uart_getdata(void);
//unsigned char uart_getc(void);
void uart_putdata(unsigned char c);
//int uart_putc(unsigned char c);
void uart_puts (char *s);
int main(void)
{
unsigned char c;
uart_init();
uart_puts("hello world!\r\n\r\n");
while(1)
{
// Poll
c = uart_getdata();
// Echo
uart_putdata(c);
}
return 0;
}
void uart_init(void)
/******************************************************************
Function: Uart_init()
Purpose: Initialise UART and set baudrate
Input: baudrate
Returns: none
******************************************************************/
{
UCSRB |= (1<<TXEN) |(1<<RXEN); // tx/rx enable
UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1
#if F_CPU < 2000000UL && defined(U2X)
UCSRA |= (1<<U2X); /* improve baud rate error by using 2x clk */
UBRRL = (F_CPU / (8UL * UART_BAUD)) - 1;
#else
UBRRL = (F_CPU / (16UL * UART_BAUD)) - 1;
#endif
}
void uart_putdata(unsigned char c)
{
int n;
n = g_idx;
g_idx = 0;
for ( g_idx=0; g_idx < n; g_idx++ ){
c = Buf[g_idx];
UDR=c;
}
bxoff=0;
return;
}
void uart_puts (char *s)
/**********************************************************************
Function: Uart_puts()
Purpose: Transmit string to UART
Input: String to be transmitted
Returns: none
**********************************************************************/
{
while (*s)
{ /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
uart_putdata(*s);
s++;
}
}
unsigned int uart_getdata(void)
{
if (bxoff == 0)
{
for ( g_idx=0; g_idx < MAX_BUFFER_SIZE; g_idx++ ){
c=UDR;
if (c == '\r'){
return;
}
else
Buf[g_idx]=c;
}
bxoff=1;
return;
}
}