Anzeige:
Ergebnis 1 bis 4 von 4

Thema: problem unter "c" CarriageReturn = CR dec = 13

  1. #1
    Registrierter Benutzer
    Registriert seit
    18.09.2000
    Ort
    ch-8408 winterthur
    Beiträge
    150

    problem unter "c" CarriageReturn = CR dec = 13

    hi,
    hab folgendes kleines problem:
    moechte zeichen ueber die serielle RS232-Schnittstelle an einen microController schicken
    im normalfall funzzt das auch.
    in einem spezialFall erwartet der Controller ein CarriageReturn ((CR=ascii), dezimal 13)
    als abschluss der zeichenkette. also:

    code schnippsel fuer den normalfall
    Code:
     printf("Command: %d \n",antw); //integer input
                      
     n = sprintf (sendData, "%d ", antw); // convert int to string
                        
     printf("SendData: %s\n",sendData); 
                     
     sendDataStr = (char *)malloc(strlen(sendData)); 
     strcpy(sendDataStr,sendData);
     s_len = strlen(sendEOF);        // "\r"
                     
     strncat(sendDataStr,sendEOF,s_len); 
     s_len = strlen(sendDataStr); 
     printf("SendDataString: %s\n",sendDataStr);
                     
     SendData();
    weiss jemand von euch, wie ich dass mit CR machen kann,
    char *sendEOF = ("\r"); == das funzzt im normalfall
    char *sendEOFCR = ("\n"); == waere das CR?

    um tipps und hinweise waer ich froh
    gruesse
    nomad

  2. #2
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.603
    Zitat Zitat von nomad Beitrag anzeigen
    sendDataStr = (char *)malloc(strlen(sendData));
    strcpy(sendDataStr,sendData);
    Hier wird bereits ein Byte zuviel geschrieben, es müsste malloc(strlen(sendData)+1) heißen, damit das abschließende 0-Byte auch noch Platz findet.

    strncat(sendDataStr,sendEOF,s_len);
    s_len = strlen(sendDataStr);
    Erstens schreibt strncat() in diesem Falle kein 0-Byte am Ende, so daß das anschließende strlen() so nicht zulässig ist. Und dann schreibst du noch mehr Bytes nach sendDataStr, obwohl bereits oben bereits ein Byte zuviel hineingeschrieben wurde.

    Korrekt wäre hingegen sowas wie:
    Code:
     sendDataStr = (char *)malloc(strlen(sendData)+strlen(sendEOF)+1); 
     strcat(strcpy(sendDataStr,sendData),sendEOF);
     printf("SendDataString: %s\n",sendDataStr);
    oder
    Code:
     sendDataStr = (char *)malloc(strlen(sendData)+2); 
     sprintf(sendDataStr,"%s\r",sendData);
     printf("SendDataString: %s\n",sendDataStr);
    weiss jemand von euch, wie ich dass mit CR machen kann,
    char *sendEOF = ("\r"); == das funzzt im normalfall
    char *sendEOFCR = ("\n"); == waere das CR?
    '\r' = CR (carriage return)
    '\n' = LF (line feed)

    Liebe Grüße,
    Axel
    Geändert von sommerfee (26-08-2009 um 06:12 Uhr)

  3. #3
    Registrierter Benutzer
    Registriert seit
    18.09.2000
    Ort
    ch-8408 winterthur
    Beiträge
    150
    hi sommerfee,
    danke fuer Deine hinweise, werd befolgen.
    zu CR:

    da der microcontroller normaleerweise unter windows funzzt,
    hab ich eben das problem dass er CR "\r" nicht erkennt ???
    vielleicht da ev. windows keine backslashes versteht also statt "\" -> "/"
    muss es heute mal wieder ausprobieren
    trotzdem vielen dank,
    gruss
    nomad

  4. #4
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.603
    Zitat Zitat von nomad Beitrag anzeigen
    da der microcontroller normaleerweise unter windows funzzt, hab ich eben das problem dass er CR "\r" nicht erkennt ???
    Das sollte nichts mit Windows oder nicht-Windows zu tun haben.

    vielleicht da ev. windows keine backslashes versteht also statt "\" -> "/"
    Es ist nicht Windows, welches den Backslash versteht, sondern der C-Compiler. '\r' ist in C immer ein einzelnes Zeichen mit dem ASCII-Code 13. '\n' ist immer ein einzelnes Zeichen mit dem ASCII-Code 10.

    Es gibt zwar Ausgabefunktionen (printf, puts, ...), die sich unter Windows anders verhalten als unter Unix (die Windows-Varianten setzen "\n" nach "\r\n" um), aber das sollte die Kommunikation mit dem Microcontroller nicht betreffen!? Über welche Funktionen funktioniert die Kommunikation mit dem Microcontroller?

    Liebe Grüße,
    Axel

Lesezeichen

Berechtigungen

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