Möchte die Daten aus der Datei OV.H auslesen und gewisses Parameter in ein Array übertragen.
Das Array sieht so aus:
myMsg.DATA[0]=0x40;
myMsg.DATA[1]=0x07;
myMsg.DATA[2]=0x20;
myMsg.DATA[3]=0x00;
myMsg.DATA[4]=0x00;
myMsg.DATA[5]=0x00;
myMsg.DATA[6]=0x00;
myMsg.DATA[7]=0x00;
Das OV sieht so aus:
struct ov_eintrag ov[MAX_OV_INDEX] =
{{0, 0, RO, 0, 0, 0, 0},
{0x2007, 0, RWZ, 2, 400, 3200, 2000}, //Maximalstrom
{0x2008, 0, RW, 2, 0xCFC0, 0xFFC0, 0xFFC0}, //Offset Iststrom 1
{0x2009, 0, RW, 2, 800, 1200, 1024}, //Korrektur Iststrom 1
möchte z.B. die Daten 0x2007 gesplittet ins Array [2](20) und [1](07)
die "0" in [3] und die "2000" also "0x7D0" in [5](07) und [4](D0).
Wie mach ich das am einfachsten????
Thx im Voraus
Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge
Wie ist denn "struct ov_eintrag" definiert? Es sind anscheinend 7 werte, wobei der dritte u.u. keine zahl ist (je nach dem wie RO, RWZ und RW definiert sind).
mr.escape
/*==================== typedefs ===========================================*/
struct ov_eintrag //Beschreibung eines OV-Eintrags im ROM
{
unsigned int index; //Index des Can-Objekts
byte sub_index; //Sub-Index des Can-Objekts
byte access; //Zugriffsart auf Can-Objekts RO/RW/RWR/RWZ
byte range; //Datenl�nge (hoechste Adresse) des Eintrags [0..3]
unsigned long low_wert; //untere Grenze des Werts
unsigned long hi_wert; //obere Grenze des Werts
unsigned long def_wert; //Voreinstellung des Werts
};
RO RWZ und RW sind f�r diesen Teil irrelevant.
i=1;//gibt den arrayindex an (im bsp. also von 0 bis mind. 3)
myMsg.DATA[1]=ov[i].index & 255;
myMsg.DATA[2]=(ov[i].index >>8) & 255;
//wenn index>0xffff dann gehen informationen verloren
myMsg.DATA[3]=ov[i].sub_index;
myMsg.DATA[4]=ov[i].def_wert & 255;
myMsg.DATA[5]=(ov[i].def_wert >>8) & 255;
//wenn def_wert>0xffff dann gehen informationen verloren
Je nach definition von myMsg.DATA könnten evtl. noch warnungen kommen (signed vs. unsigned).
mr.escape
wie ich die parameter nun aufrufe weis ich jetzt ; danke ;wenn ich diese aber nacheinander senden moechte, muss ich die sendemessage bzw dann die �bergabe ueber einen timer laufen lassen oder kann ich die r�ckantwort auf die sendemessage als flag nutzen fuer die naechste uebergabe??
mr.escape
das ganze ist aufbau einer Can-Message; myMsg.DATA... ist fuer das senden und soll nacheinander mit daten aus dem ov gefuellt werden. auf jede message die gesendet wird kommt eine empfangsbesaetigung zurueck. deshalb die frage:
"wenn ich diese aber nacheinander senden moechte, muss ich die sendemessage bzw dann die �bergabe ueber einen timer laufen lassen oder kann ich die r�ckantwort auf die sendemessage als flag nutzen fuer die naechste uebergabe??"
Ich weiß nicht, warum du der meinung bist, jemand hier wäre in der lage, dir solche fragen zu beantworten.
Ich vermute, dass mit Can "CAN- Busssysteme für Steuerung in Kfz" gemeint ist, aber ohne genaue angaben zu hardware, software und anwendungsfall, wird die antwortausbeute eher gering ausfallen (z.b. kenne ich mich mit CAN nicht aus).
mr.escape
ist nicht fuer KFZ, ist fuer ne regler-parametrierung.
aber wuerde theoretisch funktionieren das ich die rueckgabe message als flag fuer die naechste nachricht nutzen kann oder??
So etwas hängt doch vom anwendungsfall und der eingesetzten hard- und software ab.
Kommt die antwort garantiert immer innerhalb einer gewissen zeit, kann das als auslöser für die nächste message reichen (keine ausreichend schnelle antwort = fehler ).
Ist die antwort nicht unbedingt erforderlich (d.h. das senden reicht und die antwort ist nur eine extra bestätigung) wäre eine timerversion besser.
Ist eine antwort erforderlich aber nicht immer schnell genug und das senden der nächsten message möglich, bevor auf die letzte geantwortet wurde, ist eine timerversion mit verzögerter fehlerbehandlung nötig.
mr.escape
danke werde es mal über einen timer versuchen
nochmal die Frage!!
wie kann ich die parameter eine zeile nach der anderen aufrufen?
Die aus ov?
Mit einer statischen variablen, in der der aktuelle stand vermerkt ist.
Z.b.:
int lastparam, actparam=0;
bool TimerSenden(){
SendParam(actparam);
actparam++;
if(actparam>=lastparam)//alle raus
return false;//es gibt nichts mehr zu senden, timer stoppen
return true;//noch nicht fertig
}
In lastparam muss die anzahl der parameter stehen und actparam muss am anfang einer übertragung auf 0 gesetzt werden.
TimerSenden() wird bei einem timer-event aufgerufen (z.b. bei WM_TIMER oder OnTimer()). Ich gehe davon aus, dass mindestens ein parameter zum senden vorhanden ist (wegen der abbruchbedingung).
SendParam() füllt aus ov[actparam] das array myMsg.DATA[] auf und sendet diese daten (wie auch immer).
Zu bedenken ist dabei, dass windoofs kein echtzeitsystem ist und es auch mal zu längeren (alles ist relativ!) hängern kommen kann. Bei linux oder MAC-OS ist das in etwa genau so.
mr.escape.
funktioniert soweit
danke vielmals
habe das mal so versucht
for(int i=0;i myMsg.DATA[1]=ov[i].index;
myMsg.DATA[2]=ov[i].index >>8;
myMsg.DATA[3]=ov[i].sub_index;
myMsg.DATA[4]=ov[i].def_wert;
myMsg.DATA[5]=ov[i].def_wert >>8;
}
doch sobald ich das prog starte und diese Code-zeile aufgerufen werden ist i schon bis ans ende durchgelaufen.
Das posten von quellcode ist nicht ganz unproblematisch. Immer wenn < im code auftaucht, kann das als beginn eines HTML-tags gedeutet werden. Das kann zu löchern im sourcecode führen.
Deshalb ist es erforderlich, vor dem posten alle < durch < zu ersetzen.
Damit einrückungen sichtbar bleiben, müssen am zeilenanfang die leerzeichen oder tabs durch eine passende anzahl von ersetzt werden.
Aus z.b.
for(i=0;i<MAX_OV_INDEX;i++)
foo();
wird dann
for(i=0;i<MAX_OV_INDEX;i++)
foo();
ohne diese anpassung käme das raus:
for(i=0;i foo();
Soweit ich es aber aus dem HTML-sourcecode erkennen kann, soll wohl das hier stehen:
for(int i=0;i<MAX_OV_INDEX;i++){ //i gibt den Arrayindex
myMsg.DATA[1]=ov[i].index;
myMsg.DATA[2]=ov[i].index >>8;
myMsg.DATA[3]=ov[i].sub_index;
myMsg.DATA[4]=ov[i].def_wert;
myMsg.DATA[5]=ov[i].def_wert >>8;
}
Das bedeutet, dass nacheinander alle ov nach myMsg.DATA[] gefüllt werden, ohne dass dann damit etwas passiert. Das ist vermutlich sehr sehr schnell erledigt, selbst bei etwas größeren werten von MAX_OV_INDEX.
Ich war eigentlich der meinung, es hätte geklappt?
http://www.nickles.de/thread_cache/537887762.html
http://www.nickles.de/thread_cache/537885077.html
mr.escape
ja es sollen alle nacheinander die myMsg.DATA[] füllen, aber nach jedem füllen aus dem ov soll die Message gesendet werden,auf die antwort gewartet und dann die naechste zeile aus der struct eingefuegt werden
das zu http://www.nickles.de/thread_cache/537887762.html versteh ich nicht ganz
Dort steht eine möglichkeit, wie man die einzelnen datensätze aus ov, durch einen timer gesteuert, einzeln abschickt.
Der inhalt von TimerSenden() muss noch geschrieben werden und besteht aus dem ausfüllen von myMsg.DATA[], dem senden (wie auch immer das ausschaut) und dem anschl. warten auf die antwort (beim warten aber den timer stoppen und nach der antwort erneut starten, sonst könnten sich mehrere sendeaufträge sammeln).
mr.escape
kann ich den wert von ov[i].range also einen beliebigen wert mit einer zahl vergleichen
zb:
if(ov[46].range=='4')
sendpara=0x23;
else if(ov[46].range=='3')
sendpara=0x27;
geht so nicht.!!!!!!
geht das auch irgendwie anders????
Der vergleich im beispiel ist aber nicht mit zahlen, sondern zeichen. Diese sind auch acht bit lang, aber '4' ist nicht gleich 4 sondern 0x34 also 52.
Syntaktisch (formal) stimmt der code, semantisch (inhaltlich) aber ist evtl. etwas anderes gemeint (im beispiel aus dem ersten posting hat range nur werte zwischen 0 und 2).
mr.escape
das beispiel war nur ein kleiner auszug aus dem header.
die werte fuer ov.range liegen zwischen 0 und 4
also in ascii zwischen 48 und 52 bzw 0x30 und 0x34.
muss ich das dann auch so schreiben:
if(ov[46].range=='52')
sendpara=0x23;
else if(ov[46].range=='51')
sendpara=0x27;
oder so
if(ov[46].range=='0x34')
sendpara=0x23;
else if(ov[46].range=='0x33')
sendpara=0x27;
Weder noch.
if(ov[46].range==4)
sendpara=0x23;
else if(ov[46].range==3)
sendpara=0x27;
oder auch
switch(ov[46].range){
case 3: sendpara=0x27;break;
case 4: sendpara=0x23;break;
default: //hier steht das, was ansonsten geschieht
}
mr.escape