reg[0][0]=0xFF;// overwrite first byte in wr_bat_volt
14
reg[2][7]=0xAA;// overwrite last byte in wr_soc
15
}
Tipp: Benutze die Qt Creator IDE. Sie zeigt neben den fehlerhaften
Zeilen nützliche Hilfestellungen an. Sie hilft auch, Fehler zu
vermeiden, die der Compiler nicht melden würde.
Du solltest vielleicht wissen, dass die Namen der Arrays (hier:
wr_bat_volt, wr_bat_pow, wr_soc) bereits Zeiger sind. Deswegen sind die
beiden folgenden Funktionen praktisch identisch:
Da hat man offensichtlich das Anfänger Tutorial übersprungen.
Denn Pointer auf Pointer (bzw Pointer auf Array, in C praktisch
dasselbe) ist einer der Übergabeparameter für main auf allem was kein µC
ist:
1
intmain(intargc,char**argv)
2
{
3
//...
4
return0;
5
}
D.h. jedes Beispiel was die Aufruf Parameter eines Programms auswertet
würde OP zeigen wie man das programmieren kann.
Die Sprache C ist ohne Literaturstudium mit totem Holz (Büchern) schwer
verständlich.
Karl K. schrieb:> Die Befehlsfolgen sind unterschiedlich lang:
Das ist zwar hier O.T., aber bei Deinen Pointer-Kenntnissen solltest Du
erwägen, sie gleich lang zu machen und am Ende "leer" zu lassen.
Alternativ die einzelnen Arrays mit Endekennung oder Längeninfo versehen
und nur sequentiell abarbeiten (nicht 2D-indiziert).
Karl K. schrieb:> Die Befehlsfolgen sind unterschiedlich lang:
Wenn in ihnen nicht die Information über die Länge steckt, ist es eine
sehr schlechte Idee, die in ein Pseudo-2D-Array packen zu wollen.
Wie Harald geschrieben hat. Du benötigst sehr wahrscheinlich die Länge
der Befehlsfolge.
Also mach dir lieber für eine Befehlsfolge ein Struct mit einem
sprechenden Namen z.B. "command" mit einer Variable für die Länge und
einem Byte array für die eigentliche Folge.
Bzw. mach dir gleich ein typedef dafür.
und wird über
#include "sharp_types.h"
eingebunden.
Vielleicht etwas oversized. Aber der Aufwand zum Testen des Programms
ist so groß, dass es direkt auf dem avr sehr mühselig wäre.
Ja, ganz toll. Und woher weiß das, was auf "u8* reg[]" zugreift, nun,
wie lang eines der Elemente darin sind?
Diese Information geht verloren.
sizeof (wr_bat_volt)
funktioniert, aber
sizeof (reg[0])
liefert ganz was anderes.
Und .. u8? Wirklich? Spätestens seitdem es stdint.h gibt, ist sowas eine
schlechte Idee.
Harald K. schrieb:> Ja, ganz toll. Und woher weiß das, was auf "u8* reg[]" zugreift, nun,> wie lang eines der Elemente darin sind?
Bislang gibt es nur 8- und 11-Byte-Befehle. Alle Befehle zum Messen
haben 8Byte, alle Befehle zum Regeln haben 11Byte. Ein Problem, die
Länge zu unterscheiden, stellte sich bislang nicht. Falls es auftreten
sollte müsste die Länge ergänzt werden.
Karl K. schrieb:> Harald K. schrieb:>> Ja, ganz toll. Und woher weiß das, was auf "u8* reg[]" zugreift, nun,>> wie lang eines der Elemente darin sind?>> Bislang gibt es nur 8- und 11-Byte-Befehle. Alle Befehle zum Messen> haben 8Byte, alle Befehle zum Regeln haben 11Byte. Ein Problem, die> Länge zu unterscheiden, stellte sich bislang nicht. Falls es auftreten> sollte müsste die Länge ergänzt werden.
Pfuschen für Fortgeschrittene.
Klaus schrieb:> Pfuschen für Fortgeschrittene.
ja - und? Solange es funktioniert sind mir Regeln relativ egal.
Bruno V. schrieb:> Warum dann indiziert? der naive Ansatz wäre:> bat_volt = sub_wr_tx_rx(wr_bat_volt, sizeof(wr_bat_volt));> bat_kw = sub_wr_tx_rx(wr_bat_pow , sizeof(wr_bat_pow ));
guter Vorschlag. Das Programm ist in der Entwicklung - werde ich
vielleicht einbauen.
Frage:
Mein c#-programm ist ja nun in der Lage, gcc-code zu generieren.
Wahrscheinlich kann man auch make über c# aufrufen. Dann hätte man
irgendwo eine Datei main.hex in Maschinensprache für den avr. Es besteht
eine serielle Verbindung zwischen avr und PC über RS485.
Kann man über diese Verbindung main.hex mittels Bootlader auf den avr
schreiben?
Karl K. schrieb:> gcc-code
Unterscheide bitte mal "C" und "GCC"...
- C ist die Programmiersprache
- GCC ist eine Sammlung von Compilern, inklusive einem C-Compiler, der
ebenfalls "GCC" genannt wird
- Der GCC C Compiler hat wie alle anderen Compiler auch diverse
spezifische Erweiterungen, d.h. Code der diese nutzt ist GCC-spezifisch,
aber es ist dennoch C-Code
- Die GCC-Compiler können Code für viele verschiedene Plattformen
generieren, insbesondere x86/amd64 (PC), ARM, und auch AVR. Die Variante
der GCC-Compiler-Sammlung für AVR wird AVR-GCC genannt
Du generierst also C-Code. Den kannst du auch auf dem PC ausführen,
solange du keine AVR-spezifischen Dinge nutzt. Dein Problem in diesem
Thread ist ein gewöhnliches C-Problem, kein GCC-Problem, daher ist sogar
der Threadtitel verkehrt.
Karl K. schrieb:> Kann man über diese Verbindung main.hex mittels Bootlader auf den avr> schreiben?
Du kannst einfach den avrdude aufrufen.
Arrays beginnen in C mit dem Index 0 und nicht 1. Außerdem läuft bei Dir
der Index i durch die Prüfung i<7 nur bis 6. Damit wird dann nicht nur
das erste Element, sondern auch noch das letzte (achte Element)
ignoriert.
Korrekt wäre also bei 8 Elementen: