i2c buffer in array übergeben funktioniert nicht

OP #2627786
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
Angehängte Dateien:
Gast #2628286
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)
Gast #2628300
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";
OP #2628357
@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.
Gast #2628374
>uint8_t E6_getHostname()
>{
>    ...
>    return -1;

passt nicht zu

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

Gleiches Problem bei E6_getIP() und E6_work()!
Gast #2628377
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.
OP #2628387
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?
Gast #2628416
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
}
OP #2628446
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?
Gast #2628492
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!
OP #2628501
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.