Forum: Mikrocontroller und Digitale Elektronik i2c buffer in array übergeben funktioniert nicht


von Daniel P. (pirndi)


Angehängte Dateien:

Lesenswert?

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

von Krapao (Gast)


Lesenswert?

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)

von Peter II (Gast)


Lesenswert?

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";

von Daniel P. (pirndi)


Lesenswert?

@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.

von Krapao (Gast)


Lesenswert?

>uint8_t E6_getHostname()
>{
>    ...
>    return -1;

passt nicht zu

>  if(!E6_getHostname())
>  {
>    uart_puts("err hostname");
>  }

Gleiches Problem bei E6_getIP() und E6_work()!

von Krapao (Gast)


Lesenswert?

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.

von Daniel P. (pirndi)


Lesenswert?

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?

von Krapao (Gast)


Lesenswert?

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
}

von Krapao (Gast)


Lesenswert?

Lesestoff für eine ruhige Stunde:
http://c-faq.com/~scs/cgi-bin/faqcat.cgi?sec=aryptr

von Daniel P. (pirndi)


Lesenswert?

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?

von Krapao (Gast)


Lesenswert?

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!

von Daniel P. (pirndi)


Lesenswert?

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
Noch kein Account? Hier anmelden.