Hallo! Hab ein Problem mit mit meinem Code. Es soll per I2C ein CMD zu meinem Ethersex board gesendet werden und dann der Buffer zurück in ein char array geschrieben werden damit diese später im Programm verwendet werden können. wenn ich jz nur einen Befehl sende funktioniert das ganze auch.Wenn ich jz aber mehrere Befehle nacheinander sende wird zwar jede funktion aufgerufen aber wertet die erste funktion aus und rückgegeben wird der letzte Befehl genauer erklärt ich sende folgende befehle ip, hostname, mac ip wird ausgewertet empfangen wird aber die mac adresse in den für ip vorgesehenen buffer die anderen bleiben leer. sry für denn schlechten code aber ich bin noch am lernen mfg daniel
Ich rate dir, 1/ die Codeteile genau zu kennzeichnen, die von dir stammen. Mit hoher wahrscheinlichkeit stecken dort die Fehler/Probleme. Beim Fehlerlösen schaut man (ich) sich zunächst die Doku der übernommenen Codeteile (Library) an und prüft dann, ob der Fragende (du) in den selbstgeschriebenen Zeilen die Library richtig aufruft. Erst wenn die Aufrufe richtig sind, geht es ans Debuggen einer Library. 2/ ein komplett übersetzbares Programm anzugeben. In deinem Code fehlt volständig der Einstieg in die Library. Man sieht nirgends, wie dein Hauptprogramm die Library benutzt. Eine Fehlersuche ist IMHO nicht möglich (was du vielleicht schon bei der niedrigen Zahl der Antworten auf deinen Beitrag ahnst)
du machst dir aber selber das leben schwer
> uint8_t data[8] = {'h','o','s','t','n','a','m','e'};
ist es nicht einfacher zu schreiben
char* data = "hostname";
@Peter II danke für den Tip! Ich hab die Lib komplett selbst geschrieben da es sonst keine gab. Ich verwende die I2C Lib von Fleury. Einzelne anfragen über das I2C funktionieren ja. Ich denke nur das ich mit dem Array übergeben irgendwo fehler mache. Ich möchte ja später die Lib auf der Ethersex Wiki veröffentlichen deshalb wende ich mich an euch um mir zu helfen. aufgerufen wird das ganze 1x in der main mit dem befehl E6_getInfos(); dann soll er einen Befehl senden und auswerten dann der nächste und das ganze in meiner struct hinterlegen damit man später leicht auf die daten zugreifen kann.
>uint8_t E6_getHostname() >{ > ... > return -1; passt nicht zu > if(!E6_getHostname()) > { > uart_puts("err hostname"); > } Gleiches Problem bei E6_getIP() und E6_work()!
z.B.
> if(E6_work(data,sizeof(data),net.hostname))
ist immer wahr (1 oder -1). Den Fehlerfall fängst du mit den jetzigen
Rückgabewerten nicht. Du bekommst Probleme auf dem Bus nicht mit.
Danke! War ein denkfehler von mir habe jetzt alles auf return 1 und return 0 geändert! Hab mal eine frage zu denn Pointern ich habs noch nicht ganz verstanden. wenn ich meine funktion uint8_t E6_work(char *ecmd, char *buffer) aufrufe und ich habe char *buffer stehen muss ich die funktion dann die funktion so aufrufen: e6_work(&data,&net.ip); oder ohne den & operator?
1 | #include <stdio.h> |
2 | |
3 | struct { |
4 | char ip[42]; |
5 | } net; |
6 | |
7 | char data[42]; |
8 | |
9 | void E6_work(char *a, int i, char *b) |
10 | {
|
11 | printf("0x%x, %d, 0x%x\n", a, i, b); |
12 | }
|
13 | |
14 | int main(void) |
15 | {
|
16 | E6_work(data, sizeof(data), net.ip); // OK |
17 | E6_work(&data[0], sizeof(data), &net.ip[0]); // OK |
18 | |
19 | /*
|
20 | structtest.c: In function 'main':
|
21 | structtest.c:18:3: warning: passing argument 1 of 'E6_work' from incompatible pointer type
|
22 | structtest.c:9:6: note: expected 'char *' but argument is of type 'char (*)[42]'
|
23 | structtest.c:18:3: warning: passing argument 3 of 'E6_work' from incompatible pointer type
|
24 | structtest.c:9:6: note: expected 'char *' but argument is of type 'char (*)[42]'
|
25 | */
|
26 | E6_work(&data, sizeof(data), &net.ip); // nicht OK s.o. |
27 | }
|
So hab mal den ganzen code bearbeitet aber immer noch der gleiche fehler es wird zuerst time abgerufen dann die ip und das macht er springt in time wird aber nicht ausgewerten sondern schon ip bekomme auch ip zurück aber in den time buffer? wenn ich nur einen befehl ausführe klappt alles prima kann das sein das der I2C(Ethersex) nicht nachkommt? eigentlich sollte er ja durch die if schleife auf das return warten oder sehe ich das falsch?
Wenn du signifikante Änderungen im Code gemacht hast, hänge die bitte an deine Frage an. >> aufgerufen wird das ganze 1x in der main mit dem befehl E6_getInfos(); > es wird zuerst time abgerufen dann die ip und das macht er Irgendwas ist da fischig. main() ruft nach deinen Angaben E6_getInfos() auf und E6_getInfos() ruft laut Code network.c als erstes E6_getIP() auf. Von time ist da keine Spur!
ja sry time ist halt nur ein anderer cmd. das heist mein ablauf müsste stimmen. dann wirds wohl am Ethersex liegen das der nicht nachkommt. Edit: jo lieg an ethersex lasse ich ihn 3 sek zeit zum auswerten dan funktioniert es
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.