Forum: Mikrocontroller und Digitale Elektronik uart1_gets() geht nicht; usart_gets() funktioniert


von Hansi berter (Gast)


Lesenswert?

Hier mal ein Auszug aus meinem Programm, die Überschrift sagt ja fast 
alles.
Sehe einfach den Fehler nicht!
Benutze einen ATmega128

Kann mir jemand kurzfristig helfen?

/*********************************************************************** 
**
Function: uart_getc_wait()
Purpose:
Input:
Returns:
************************************************************************ 
**/


uint8_t uart_getc_wait()
{
  unsigned int c;

  do {
    c = uart_getc();
  } while( c == UART_NO_DATA );

  return (uint8_t)c;
}
/*********************************************************************** 
**
Function: void uart_gets()
Purpose:  get string from UART0
Input:
Returns:  none
************************************************************************ 
**/
void uart_gets( char* Buffer, uint8_t MaxLen )
{
  uint8_t NextChar;
  uint8_t StringLen = 0;

  NextChar = uart_getc_wait();         // Warte auf und empfange das 
nächste Zeichen

                                  // Sammle solange Zeichen, bis:
                                  // * entweder das String Ende Zeichen 
kam
                                  // * oder das aufnehmende Array voll 
ist
  while( NextChar != '^' && StringLen < MaxLen - 1 ) {
    *Buffer++ = NextChar;
    StringLen++;
    NextChar = uart_getc_wait();
  }

                                  // Noch ein '\0' anhängen um einen 
Standard
                                  // C-String daraus zu machen
  *Buffer = '\0';
}

/*********************************************************************** 
**
Function: uart1_getc_wait()
Purpose:
Input:
Returns:
************************************************************************ 
**/


uint8_t uart1_getc_wait()
{
  unsigned int d;

  do {
    d = uart1_getc();
  } while( d == UART_NO_DATA );

  return (uint8_t)d;
}
/*********************************************************************** 
**
Function: void uart1_gets()
Purpose:  get string from UART0
Input:
Returns:  none
************************************************************************ 
**/
void uart1_gets( char* Buffer, uint8_t MaxLen )
{
  uint8_t NextChar;
  uint8_t StringLen = 0;

  NextChar = uart1_getc_wait();         // Warte auf und empfange das 
nächste Zeichen

                                  // Sammle solange Zeichen, bis:
                                  // * entweder das String Ende Zeichen 
kam
                                  // * oder das aufnehmende Array voll 
ist
  while( NextChar != '^' && StringLen < MaxLen - 1 ) {
    *Buffer++ = NextChar;
    StringLen++;
    NextChar = uart1_getc_wait();
  }

                                  // Noch ein '\0' anhängen um einen 
Standard
                                  // C-String daraus zu machen
  *Buffer = '\0';
}


#endif

von Helfer (Gast)


Lesenswert?

Der Unterschied wird in den folgenden, nicht gezeigten Funktionen 
liegen:

    c = uart_getc();
vs.
    d = uart1_getc();

Vermutlich lauscht uart_getc() an UART0

von soundso (Gast)


Lesenswert?

wo ist die funktion uart1_getc();

tippe auf fehler darin ...

von Hansi berter (Gast)


Lesenswert?

Stimmt , hab ich vergessen zu schicken , hier der nachtrag!

/*********************************************************************** 
**
Function: uart1_getc()
Purpose:  return byte from ringbuffer
Returns:  lower byte:  received byte from ringbuffer
          higher byte: last receive error
************************************************************************ 
**/
unsigned int uart1_getc(void)
{
    unsigned char tmptail;
    unsigned char data;


    if ( UART1_RxHead == UART1_RxTail ) {
        return UART_NO_DATA;   /* no data available */
    }

    /* calculate /store buffer index */
    tmptail = (UART1_RxTail + 1) & UART_RX_BUFFER_MASK;
    UART1_RxTail = tmptail;

    /* get data from receive buffer */
    data = UART1_RxBuf[tmptail];

    return (UART1_LastRxError << 8) + data;

}/* uart1_getc */

von Stefan E. (sternst)


Lesenswert?

Und wo ist der ganze Rest? Die Interrupt-Routinen, wo die Buffer befüllt 
werden? Die Initialisierungen? Deklarationen der beteiligten globalen 
Variablen?

Und informiere dich über die C-Code-Tags und Datei-Anhänge hier im 
Forum.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.