PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : problem unter "c" CarriageReturn = CR dec = 13



nomad
20-04-2009, 12:14
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


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

sommerfee
20-04-2009, 19:59
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:


sendDataStr = (char *)malloc(strlen(sendData)+strlen(sendEOF)+1);
strcat(strcpy(sendDataStr,sendData),sendEOF);
printf("SendDataString: %s\n",sendDataStr);

oder


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

nomad
21-04-2009, 08:27
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

sommerfee
21-04-2009, 08:52
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