Hallo,
Ich schon wieder. Wie oben schon beschrieben bekomme ich es nicht hin in
ein char Array eine double/float Variable hineinzubringen.
Hier mal der Versuch:
1
staticcharspi_buf[32];
2
3
voidsendDouble(doublen)
4
{
5
spi_buf[0]=n>>24;
6
spi_buf[1]=n>>16;
7
spi_buf[2]=n>>8;
8
spi_buf[3]=n;
9
}
Was mach ich da falsch? Hat das was mit casten zu tun?
Steffen
So sollte es gehen...
Ansonsten dein n mal auf
char * ptr = (char*) &n;
casten, dann müsste auch
spi_buf[0] = ptr[3];
funktionieren, aber memcpy ist einfacher...
mfg Andreas
Danke für die Anworten.
Mit memcpy funktioniert das auch, aber ich habe vorher noch eine
Berechnung und will dann die berechneten double/Floats hintereinander in
das spi_buf Array schreiben. Deswegen der gescheiterte Klimmzug über
die Funktion sendDouble. Also ich versuchs konkreter zu erklären durch
mehr code.
Variablen:
1
staticcharspi_buf[32];
2
typedefstruct{
3
int32_tposition[3];// Real-time machine position vector in steps.
4
uint8_tcoord_select;// Active work coordinate system number.
Steffen H. schrieb:> Ist der maximal zu erwartende spi transfer.>>> Steffen
memcpy(spi_buf+pos*sizeof(double), &n, sizeof(double));
Wobei pos 0 ... sizeof(spi_buf) / sizeof(double).
Vergiss das Shiften, ist so einfacher, natürlich musst du pos
entsprechend hochzählen bei jedem Senden.
mfg Andreas
Andreas B. schrieb:> Wobei pos 0 ... sizeof(spi_buf) / sizeof(double).>> Vergiss das Shiften, ist so einfacher, natürlich musst du pos> entsprechend hochzählen bei jedem Senden.
Heißt das ich nach jedem Aufruf
> Sollte es so gehen?
Wenn du hier mit sizeof(double) multiplizierst, dann brauchst du pos
aussen nicht mit sizeof(double) erhöhen. Du hast doch die Abstände schon
in der Multiplikation berücksichtigt.
Wenn du jeweils 5 SChachteln in Folge (in einer Sequenz) aufstellst, wo
steht dann die erste Schachtel der 6-ten Sequenz?
Die steht in der 6*5 = 30-ten Position,
sizeof liefert dir einfach nur die Größe des angegebenen in Bytes.
Karl Heinz Buchegger schrieb:> Wenn du hier mit sizeof(double) multiplizierst, dann brauchst du pos> aussen nicht mit sizeof(double) erhöhen. Du hast doch die Abstände schon> in der Multiplikation berücksichtigt.
Stimmt, so gehts natürlich auch. Hab ich ja voll übersehen. Aber pos
muss ich außen ja trotzdem erhöhen. Dann allerdings nur um 1. (pos++;)
Würde mich jetzt mal interessieren, welche der beiden Varianten hier
mehr Resourcen verbraucht.
Ich sehe gerade, ich hab es jetzt eh etwas anders gelöst. Aber es
funktioniert.
Karl Heinz Buchegger schrieb:> Bist du sicher, dass die 11 zum Schluss korrekt sind?> Wenn das eigentlich 12 sein sollten (wegen 3*sizeof(double) == 12
Ja, das ist schon richtig so. Denn in der spi_write_data wird ja schon
1Byte an SPDR übergeben. Und somit fehlt eins zum countern in der ISR.
Danke für die Hilfe.
Steffen
Steffen H. schrieb:> Karl Heinz Buchegger schrieb:>> Bist du sicher, dass die 11 zum Schluss korrekt sind?>> Wenn das eigentlich 12 sein sollten (wegen 3*sizeof(double) == 12> Ja, das ist schon richtig so. Denn in der spi_write_data wird ja schon> 1Byte an SPDR übergeben. Und somit fehlt eins zum countern in der ISR.
ui.
Solche Sachen sollte die spi_write_data selber regeln.
Du übergibst 12 Bytes an die Funktion. Die Funktion stellt eines in SPDR
und 11 in einen Buffer.
Das ist das, was man erwarten würde: Ich habe 12 Bytes und das sage ich
auch genau so der Funktion. Wie die Funktion das dann intern regelt, das
ist Sache der Funktion - das geht mich als Aufrufer nichts an. Ich weiß
nur, dass ich 12 Bytes auf die Reise bringen will, und das teile ich
auch der Funktion so mit.
Sowas sind typische Stolpersteine über die du in ein paar Wochen mehr
als einmal stolpern wirst. Gestalte Funktionalitäten nach Möglichkeit
immer so, dass sie FÜR DEN AUFRUFER(!) logisch sind. Denn der muss damit
klar kommen und je weniger Spezial- und Sonderfälle man beim Aufruf
einer Funktion wissen bzw. unterscheiden muss, desto weniger läuft man
Gefahr dabei einen Fehler zu machen. Und Fehler macht man als
Programmierer - du genauso wie ich.
Steffen H. schrieb:> Was mach ich da falsch? Hat das was mit casten zu tun?
Um das auch noch mal aufzunehmen: Beantworte dir die Frage doch selber,
zur Not auch mit Hilfe (d)eines C-Buches. Der Lerneffekt daraus wird
dein Verständnis zu Datentypen in C erheblich erweitern.
Oliver
Karl Heinz Buchegger schrieb:> Solche Sachen sollte die spi_write_data selber regeln.> Du übergibst 12 Bytes an die Funktion. Die Funktion stellt eines in SPDR> und 11 in einen Buffer.
So hab ich es jetzt gemacht. War nur eine kleine Änderung in der
spi_write_data .