Forum: Mikrocontroller und Digitale Elektronik atxmega TWI string übergabe


von Patrick S. (patricksch)


Lesenswert?

Hallo
Ich muss für TWI (ich benutzte den Atmel Treiber, der einzelne Bytes 
übergibt) meine Strings in Bytes teilen, damit ich sie mittels TWI 
übermitteln kann.
Hat hierbei einer Erfahrung wie man das macht?
Oder ist es einfach den TReiber umzuschreiben?
Vielen Dank!

von Peter II (Gast)


Lesenswert?

Patrick Schmelzer schrieb:
> meine Strings in Bytes teilen

wo ist genau das Problem? dein String ist doch ein Array von bytes( 
char) und die kann man einfach mit einer schleife abrufen.

von Patrick S. (patricksch)


Lesenswert?

hier ein Beispiel:

#define VERSION "t"
wenn ich das ganze jetzt in int umwandle zum übergeben:
uint8_t = atoi(VERSION);
//hier die Übergabe von MCU an PC mit readbuffer
char output[10]
snprintf(output, "%d", readbuffer)


Hier bekomme ich immer einen Buffer overflow, keine Ahnung warum.
Was mach ich, wenn der #define String aus mehr als einem Byte besteht?

von Peter II (Gast)


Lesenswert?

Patrick Schmelzer schrieb:
> uint8_t = atoi(VERSION);
was ja auch Unsinn  ist.
1
char* text = "test";
2
3
for( uint8_t i = 0; i < strlen( text ); ++i ) {
4
   uint8_t x = (uint8_t)text[0];
5
   // sende x
6
}

von Arduinoquäler (Gast)


Lesenswert?

Peter II schrieb:
> for( uint8_t i = 0; i < strlen( text ); ++i ) {
>    uint8_t x = (uint8_t)text[0];
>    // sende x
> }

Was für ein Overhead. Wenn der Compiler es nicht wegoptimiert
dann wird strlen(...) bei jedem Schleifendurchlauf neu
aufgerufen ..... da biegen sich mir die Zehennägel hoch.

von Patrick S. (patricksch)


Lesenswert?

Kannst du mir erklären, warum das Unsinn ist?
Die Rückumwandlung mit snprintf stimmt ?

von Peter II (Gast)


Lesenswert?

Arduinoquäler schrieb:
> Was für ein Overhead. Wenn der Compiler es nicht wegoptimiert
> dann wird strlen(...) bei jedem Schleifendurchlauf neu
> aufgerufen ..... da biegen sich mir die Zehennägel hoch.

zum glück optimieren ja die Compiler. Außerdem geht es hier um ein 
Beispiel nicht um optimalen code.
Das senden über TWI wird eh so langsam sein, es nicht mal einen 
unterschied machen würde.

von Peter II (Gast)


Lesenswert?

Patrick Schmelzer schrieb:
> Kannst du mir erklären, warum das Unsinn ist?
1
uint8_t = atoi(VERSION);

1. du hast nicht mal einen Name für die Variable.
2. wie soll man dann aus einen "t" eine Zahl machen?

von Oliver S. (oliverso)


Lesenswert?

Patrick Schmelzer schrieb:
> Kannst du mir erklären, warum das Unsinn ist?

Dein C-Buch sollte das können...

Oliver

von Patrick S. (patricksch)


Lesenswert?

Mein Fehler, dass ich die Variable vergessen habe.
Meine Frage war auch eher, ob ich atoi verwenden kann, um den String 
"kurzzeitig" in einen int umzuwandeln, zu verschicken, und dann 
zurückzuwandeln. -->anscheinend nicht
Gibt es auch die Möglichkeit irgendwie anstatt uint8_t x = 
(uint8_t)text[0];
auch mehrere Charaktere in die Variable zu schreiben?

von Peter II (Gast)


Lesenswert?

Patrick Schmelzer schrieb:
> auch mehrere Charaktere in die Variable zu schreiben?

ja nennt sich denn Array.

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.