Moin zusammen,
eigentlich betrifft es nicht nur ARM MCUs, sondern eher was Allgemeins, aber dazu haben wir irgendwie keine Rubrik, bzw. ich habe keine passende gefunden. Wenn es doch eine gibt, wo die Frage besser aufgehoben ist, dann bitte verschieben
Danke sehr!
Nun zur eigentlichen Frage. Ich habe ein Projekt am Wickel, bei dem es sich um ein Diagnoseinterface geht, nach J2534 Standard. Bei J2534 wird die Hardware maximal von der Diagnosesoftware weggekapselt und die Kommunikation findet über eine DLL statt, die vom Hersteller des DIagnoseinterfaces zur Verfügung gestellt wird.
Man kann sich das Ganze in etwa so vorstellen:

Die Diagnosesoftware greift über die J2534-Schnittstelle (die eigentlich nur eine DLL mit ein paar Exports ist, aber dazu später mehr) auf die Hardware (VCI = Vehicle Communikation Interface) zu, die wiederrum auf das Auto zugreift. Die Software schickt ihr Zeug in die J2534 und bekommt eine Antwort, fertig.
Die Schnittstelle ist wie folgt spezifiziert:

Sprich die DLL exportiert die fettgeschriebenen Funktionen und die Diagnosesoftware ruft sie auf, mit entsprechenden Parameter.
Diese Parameter sind aber sehr unterschiedlich (Returnwert ist immer ein unsigned long, der eigentlich ein Enum ist):
CodeBox C
Wie man sieht sind es keine einfachen Strings...
Hardwaremässig verwende ich USB CDC Klasse, das funktioniert auch sehr gut, ich kann die Daten (hello world) zwischen dem Nucleo32 und dem PC hin und her schicken, passt alles.
Frage:
Gibt es eine elegante Möglichkeit die Funktionsaufrufe samt Parameter hin und her zu schicken? Klar, man kann das ganze Zeug irgendwie in ein uint8_t buffer* verpacken, über USB versenden und auf der anderen Seite dann wieder auseinanderfummeln, aber das ist eher eine Holzhammermethode. GIbt es da irgendwas Eleganteres? Ich weiß leider nicht, was die großen Hersteller wie Bosch, Hella und etc an der Stelle verwenden... hatte so ein Gerät nicht wirklich in der Hand gehabt.
Danke Euch im Voraus!
eigentlich betrifft es nicht nur ARM MCUs, sondern eher was Allgemeins, aber dazu haben wir irgendwie keine Rubrik, bzw. ich habe keine passende gefunden. Wenn es doch eine gibt, wo die Frage besser aufgehoben ist, dann bitte verschieben
Nun zur eigentlichen Frage. Ich habe ein Projekt am Wickel, bei dem es sich um ein Diagnoseinterface geht, nach J2534 Standard. Bei J2534 wird die Hardware maximal von der Diagnosesoftware weggekapselt und die Kommunikation findet über eine DLL statt, die vom Hersteller des DIagnoseinterfaces zur Verfügung gestellt wird.
Man kann sich das Ganze in etwa so vorstellen:

Die Diagnosesoftware greift über die J2534-Schnittstelle (die eigentlich nur eine DLL mit ein paar Exports ist, aber dazu später mehr) auf die Hardware (VCI = Vehicle Communikation Interface) zu, die wiederrum auf das Auto zugreift. Die Software schickt ihr Zeug in die J2534 und bekommt eine Antwort, fertig.
Die Schnittstelle ist wie folgt spezifiziert:

Sprich die DLL exportiert die fettgeschriebenen Funktionen und die Diagnosesoftware ruft sie auf, mit entsprechenden Parameter.
Diese Parameter sind aber sehr unterschiedlich (Returnwert ist immer ein unsigned long, der eigentlich ein Enum ist):
- unsigned long
- unsigned long*
- char*
- void*
- struct SBYTE_ARRAY
- struct SCONFIG
- struct SCONFIG_LIST
- struct PASSTHRU_MSG
CodeBox C
typedef struct _PASSTHRU_MSG { unsigned long ProtocolID; unsigned long RxStatus; unsigned long TxFlags; unsigned long Timestamp; unsigned long DataSize; unsigned long ExtraDataIndex; unsigned char Data[4128]; } PASSTHRU_MSG; typedef struct _SCONFIG { unsigned long Parameter; // Name of parameter unsigned long Value; // Value of the parameter } SCONFIG; typedef struct _SCONFIG_LIST { unsigned long NumOfParams; // Number of SCONFIG elements SCONFIG *ConfigPtr; // Array of SCONFIG } SCONFIG_LIST; typedef struct _SBYTE_ARRAY { unsigned long NumOfBytes; // Number of bytes in the array unsigned char *BytePtr; // Array of bytes } SBYTE_ARRAY;
Wie man sieht sind es keine einfachen Strings...
Hardwaremässig verwende ich USB CDC Klasse, das funktioniert auch sehr gut, ich kann die Daten (hello world) zwischen dem Nucleo32 und dem PC hin und her schicken, passt alles.
Frage:
Gibt es eine elegante Möglichkeit die Funktionsaufrufe samt Parameter hin und her zu schicken? Klar, man kann das ganze Zeug irgendwie in ein uint8_t buffer* verpacken, über USB versenden und auf der anderen Seite dann wieder auseinanderfummeln, aber das ist eher eine Holzhammermethode. GIbt es da irgendwas Eleganteres? Ich weiß leider nicht, was die großen Hersteller wie Bosch, Hella und etc an der Stelle verwenden... hatte so ein Gerät nicht wirklich in der Hand gehabt.
Danke Euch im Voraus!
Zuletzt bearbeitet: