- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 10

Thema: Wirres Zeug mit C bei der UART übertragung von µC zu PC

  1. #1

    Wirres Zeug mit C bei der UART übertragung von µC zu PC

    Anzeige

    Praxistest und DIY Projekte
    Hi,

    Hab das myAVR Board.

    Mit C Schaffe ich es aber einfach nicht mit dem UART umzugehen.

    Mit Bascom geht das ohne Probleme.

    Folgenen Code benutze ich (aus der Roboternetz wiki)

    Code:
     #include <inttypes.h> 
     #include <stdio.h> 
     #include <avr/io.h> 
    
     #define F_CPU 3686400 
     #define USART_BAUD_RATE 9600 
     #define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16)-1) 
    
     char cText[] = "Hello, world !\r\n";
    
     //-----------------------------------------------------
     void _writeChar(char c)
     {
         while (!(UCSRA & (1<<UDRE))) {} 
             UDR = c; 
     }
     //-----------------------------------------------------
     void _writeString(unsigned char *string) 
     { 
          while ( *string) 
              _writeChar(*string++); 
     } 
     //-----------------------------------------------------
     void main()
     {
          UCSRB |= (1<<TXEN); 
          UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); 
          UBRRL = (unsigned char) USART_BAUD_SELECT; 
          _writeString(cText); 
      }
    im Terminal bekomm ich aber das hier: (obere 2 mit Bascom unteres mit C)

    Bild hier  

    mit Bascom hab ich es auch so wie in der Wiki gemacht.

    Was mach ich denn jetzt falsch???

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Hallo, versuch mal
    #define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16L)-1)
    Also mit einem "L" nach "16"
    Ich muß das nochmal überprüfen, dann bessere ich das ggf. aus
    Sollte das so sein, dann bitt' ich um Vergebung
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    ich glaubs nicht... Das war die Lösung!!! Danke!!!

    Vieleicht sollte man das mal in der Wiki berichtigen.

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Nachdem du ja jetzt das Versuchs-Meerschweinchen warst, hab' ich es gleich ausgebessert. Tut mir leid !
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    eine Frage noch:

    Wie kann ich eine uint8 variabel in ein String umwandeln das ich sie mit de r writeString funktion senden kann?

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Du meinst beim Einlesen ?
    Du kannst die Zeichen in einem Array sammeln
    Code:
    uint8    bChar[64];           // 64 wär der längste string
    unit8    bIdx;                   // Index
    
        bIdx = 0;
        do { 
             while ( !(UCSRA & (1<<RXC)) ) {}
             bChar[bIdx]  = UDR; 
    
             while (!(UCSRA & (1<<UDRE)))  {} 
             UDR = bChar[bIdx] ;             // Echo 
    
             if (bChar[bIdx]  == 0x0D)       // bei <ENTER> aufhören
                   break;
               bIdx++;
          } while (1); 
          bIdx++;
          bChar[bIdx]  = 0x0A;       // wir hängen noch ein LF an
          bIdx++;
          bChar[bIdx]  = 0x00;       // und ein \0 als ende-Kennzeichen
    
    
        _writeString((unsigned char*)&bChar[0] );  // alles abschicken
    
    }
    Versuch's mal !


    Ich hoff', es ist kein Hund drinnen
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    das kann ich sicher auch gebraucht

    aber ich habe was anderes gemeint.

    wenn ich vom Microcontroller irgend eine Variabel mit einem Wert an den PC senden will, muss der Wert doch erst in ein String umgewandelt werden, oder?

    Wie geht das?

    hast einmal unit8 geschrieben anstatt uint8

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Du mußt nur umwandeln, wenn am PC nur ein Terminal zu Hause ist, das eben nix anderes als strings und ein paar Steuerzeichen versteht.
    In der GCC-Library gibt's eine menge funktionen, mit denen man irgendwas in strings verwandeln kann. Ich weiß die jetzt auch nicht auswendig, da muß ich immer selber nachschauen.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  9. #9
    ok ich schaus mir mal an.

    Danke nochmal für deine Hilfe

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    35
    Beiträge
    826
    sprintf() ist das was du suchst in einer normalen C-Lib. In den extra libs für die µC gibts aber eigentlich auch noch die itoa() analog zur atoi().

    Andun
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad