- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: C macht mich wahnsinnig

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385

    C macht mich wahnsinnig

    Anzeige

    Powerstation Test
    Hi,
    ich will, dass mein PC mit dem AVR über UART kommunizieren kann. Erstmal soll der Controller nur Befehle empfangen können, später Daten zurücksenden.
    Wenigstens kann ich schon mal interruptgesteuert Zeichen vom UART lesen. Das ist ja schon mal was. Aber jetzt kommen wieder C Basics ins Spiel. Ich warte jetzt auf ein Startzeichen und hänge dann alle empfangenen Zeichen aneinander, bis das Stopzeichen kommt. Dann soll das bis jetzt Empfangene ausgewertet werden.

    1. Frage:
    Wie hänge ich ein char an einen String? Das ganze soll auch in der Länge variabel sein.

    2. Frage:
    Wie vergleiche ich 2 chars?
    if(c == 't') funktioniert ja nicht. Da kommt immer die Meldung, dass das immer false ist aus irgendeinem bescheuerten Grund.


    C ist schon seltsam.

    mfg
    jagdfalke

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    35
    Beiträge
    826
    Das Problem ist, dass Strings keinen eigenen Datentypen sind. Strings sind arrays. Deswegen kann man sie auch nciht direkt aneinander hängen.

    Da gibt es spezielle Funktionen. Musste mal nach suchen in der Doku.

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

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Und was hälst Du von einem Puffer im RAM z.B. 10 Bytes,
    dort verschiebst Du Deine empfangenen Zeichen hin, bis ein Stop Zeichen kommt.
    Dann kannst Du alles mit weiß was ich was vergleichen, ohne chars an Strings anhängen zu müssen.
    C ist nicht seltsam, sondern Deine Denkweise ist seltsam.

    Gruß Sebastian

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    13.10.2005
    Beiträge
    25
    Moin!

    Ein String ist ein Array of Char.
    Es gibt zwei Möglichkeiten dein Problem zu lösen.
    Die Primitive:
    Man kann sich anfangs einen Buffer erzeugen (volatile char ca_x[20], mit der maximalen Nachrichtengrösse, dazu einen volatile char counter, der bei jedem empfangenen Zeichen hochgezählt wird und als Index für das Array genutzt wird.
    Interrupt:
    counter++;
    ca_x[counter]=Zeichen vom UART;


    Eleganter dürfte die Variante mit Pointern sein, aber auch da wird der Pointer im Interrupt hochgesetzt. Und dann an die Stelle auf die der Pointer zeigt das Zeichen geschrieben.


    Zum Problem mit dem char Vergleich:
    Eigentlich müsste es gehen. (Bei mir geht es, aber ich nutze auch einen Fujitsu Microcotroller & Workbench)

    Man könnte das Problem umgehen, in dem man die Zeichen nach dem Ascii Code zu Zahlen umwandelt. Also nicht uc=='a' sondern uc==0x61 oder uc==97.

    eine empfehlenswerte Seite:
    http://www.pronix.de/pronix-735.html

    MfG Argentan

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    48
    Beiträge
    1.146
    Umfangreiche String-Funktionen findest Du in der string.h (liegt in avr\include). Wenn Du viel mit Strings arbeitest, kommst Du an ihr nicht vorbei.
    Dort findest Du z.B. Funktionen zum Vergleichen von Strings (strcmp), zum ermitteln der Länge von Strings oder zum kombinieren von Strings. Beschrieben sind die Funktionen im libc manual.
    Wenn Du Fragen dazu hast, melde Dich, ich kenne die string.h eigentlich recht gut...

    askazo

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Zitat Zitat von argentan
    Interrupt:
    counter++;
    ca_x[counter]=Zeichen vom UART;
    Incrementieren eher nachher, denk ich, was steht den dann auf ca_x[0] ?

    Zitat Zitat von argentan
    Also nicht uc=='a' sondern uc==0x61 oder uc==97.
    Das ist für C Jacke wie Hose. Vergeßt aber nicht die Klein/Großschreibung
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    also z.B. so ?
    Code:
    
    char readChar(void);
    char str* = "";
    
    SIGNAL(SIG_USART_RECV) {
         s = readChar():
         s++;
    }
    mfg
    jagdfalke

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Code:
    char readChar(void);
    char Instring[MAX_CHAR];
    char InIdx = 0;
    
    SIGNAL(SIG_USART_RECV) { 
         Instring[InIdx] = readChar();
         switch (Instring[InIdx])
         {
         case ENTER:                    // ev. signalisieren an "Main()"
               Instring[InIdx] = 0;   // korr. Stringterminator to \0
               break;  
        case START:                   // Startzeichen ?? 
               InIdx = 0;  
               break;  
         default:
               InIdx++; 
               break;  
        }
        if (InIdx > MAX_CHAR)    
        {  overflow, was machen wir ?  }
    }
    So etwa halt
    Nicht berücksichtigt sind falsche Zeichen, CAN od. Delete usw. und ECHO, wenn es eine Tastatureingabe ist
    Die Auswertung ist Case-Sensitiv, muß man aufpassen
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.02.2005
    Beiträge
    385
    START und ENTER sind hier char-Variablen, die die Start- bzw Stoppzeichen enthalten oder? Ok, habs gecheckt.
    Das wäre dann die Methode mit begrenzter Länge. Und wie geht das mit diesem Pointer-Ding?

    mfg
    jagdfalke

  10. #10
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Pointer oder Index läuft auf das gleiche raus. Index is ein Pointer ab feldanfang, Pointer ab Speicheranfang. Ich würde mich entscheiden, je nachdem WO und WIE ich im restlichen Programm die Daten brauch oder hab'.
    Code:
    char readChar(void); 
    char Instring[MAX_CHAR]; 
    char* InPnt = (char*)&Instring[0];    // ich geh gern auf Nr.Sicher und caste 
    
    SIGNAL(SIG_USART_RECV) { 
         *InPnt = readChar(); 
          switch (*InPnt) 
         { 
         case ENTER:                    // ev. signalisieren an "Main()" 
              *InPnt = 0;
               break;  
        case START:                   // Startzeichen ?? 
               InPnt = (char*)&Instring[0];
               break;  
         default: 
               InPnt++;
               break;  
        } 
    }
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress