Verständnisproblem Strings/Array's in C

Jackson0

Grünschnabel
Hallo,

ich bin noch Anfänger und programiere in C (nicht++) und habe folgendes Problem:

Es werden an ein "Gerät" Binärdaten mit Unterschiedlichen längen gesendet (SendObdCommand) die dann von dem "Gerät" jeweils beantwortet (ReceiveObdCommand) werden. Dazu wird immer die Länge der Daten beötigt und die Daten können alle Werte zw. 00-FF haben.



Code:
{ char SendData[] = { 0x10, 0x89 };
SendObdCommand(SendData, sizeof(SendData)); }
ReceiveObdCommand();
{ char SendData[] = { 0x1A, 0x9B, 0x00, 0xFF };
SendObdCommand(SendData, sizeof(SendData)); }
ReceiveObdCommand();
{ char SendData[] = { 0x27, 0x03 };
SendObdCommand(SendData, sizeof(SendData)); }
ReceiveObdCommand();

// bis hier hin läuft alles wunderbar allerding nur mit Konstanten Daten
// wenn ich flexibele Daten Senden möchte geht es nicht

{ char SendData[] = {0x27, 0x04, ReceiveData[3], ReceiveData[4], ReceiveData[5], ReceiveData[6] };
SendObdCommand(SendData, sizeof(SendData)); }
ReceiveObdCommand();

Gibt beim compilen folgenden Fehler:
*** ..\src\main.c(408) E4032C: initialization: constant expression is expected for variable: `SendData'
make: *** [src/main.o] Error 2

Wie löse ich das Problem?

Gruß
Jackson
 
Zuletzt bearbeitet:
Hi und Willkommen bei tutorials.de,

einfach nach der Reihe:
C:
char SendData[6]:
SendData[0] = 0x27;
SendData[1] = 0x04;
SendData[2] = ReceiveData[3];
...
bzw. mit Schleife etwas kürzer:
C:
int i;
char SendData[6]:
SendData[0] = 0x27;
SendData[1] = 0x04;
for(i = 2; i < 6; i++)
    SendData[i] = ReceiveData[i + 1];

Es wäre vllt. besser, das Array einmal am Anfang mit einer ausreichenden Größe zu erstellen,
je nach Bedarf füllen und statt sizeof... jeweils die tatsächliche Byteanzahl übergeben.
 
Klappt dann aber auch nur wenn ich in {} Klammern schreibe:

Code:
		{char SendData[6];
		SendData[0]=0x27;
		SendData[1]=0x04;
		SendData[2]=ReceiveData[3],
		SendData[3]=ReceiveData[1];
		SendData[4]=ReceiveData[8]-1;
		SendData[5]=ReceiveData[4]+10;
		SendObdCommand(SendData, 6);}
		ReceiveObdCommand();

Gibt es da wirklich keinen eleganteren Weg? Machmal sind die zu senden Daten bis zu 64Bytes groß und ich muss sie erst mühselig so eintippen und dann von Hand die Länge ermitteln und eintragen. Und wenn ich ich mal verzählt habe gerät alles durcheinander und man sucht sich dusselig nach dem Fehler...
 
Noch ein Frage, irgendwann wird in
ReceiveData[4] und ReceiveData[5] eine short Zahl (2Byte) übermittelt die ich beim Senden mit einer anderen Short Zahl addieren werden muss, wie mache ich das am besten?
Wenn Beispielsweise in ReceiveData 4 und 5 01F0 steht soll dann das Ergebnis der Additon von 01F0 und Beispielsweise: 0120 = 0310 in SendData 4 und 5 übermittelt werden.

SendData[5]=ReceiveData[4]+Zahl high Byte;
SendData[6]=ReceiveData[5]+Zahl low Byte;

Funktioniert natürlich nicht, wie muss es richtig lauten?
 
Zuletzt bearbeitet:
Weil lokale Variabeln zu Beginn des Scopes angegeben werden müssen.
C:
char ReceiveData[] = { ... };
char SendData[6] = { 0 };
// do receive
SendData[0] = 0x27;
SendData[1] = 0x04;
// ...

Grüsse
Cromon

Ja normal habe ich die auch immer EINMAL zu beginn angegeben.

Jetzt ist es aber so das sie jedesmal wenn ein neues Komando gesendet werden muss jedesmal neu angegeben werden muss. Und es müssen viele Komandos gesendet werden...

edit:
Noch ein Frage, irgendwann wird in
ReceiveData[4] und ReceiveData[5] eine short Zahl (2Byte) übermittelt die ich beim Senden mit einer anderen Short Zahl addieren werden muss, wie mache ich das am besten?
Wenn Beispielsweise in ReceiveData 4 und 5 01F0 steht soll dann das Ergebnis der Additon von 01F0 und Beispielsweise: 0120 = 0310 in SendData 4 und 5 übermittelt werden.

SendData[5]=ReceiveData[4]+Zahl high Byte;
SendData[6]=ReceiveData[5]+Zahl low Byte;

Funktioniert natürlich nicht, wie muss es richtig lauten?

Keiner ne Idee?
 
klappt irgendwie noch nicht sieht aus als wenn die Bytes verdreht sind!?

Code:
			ReceiveObdCommand();
			{char SendData[6];
			SendData[0]=0x27;
			SendData[1]=0x04;
			SendData[2]=ReceiveData[2],
			SendData[3]=ReceiveData[3];
			*((short *)(&SendData[4])) = *((short *)(&ReceiveData[4])) + pin;
			SendObdCommand(SendData, 6);}
			ReceiveObdCommand();

In ReceiveData steht:
00 01 02 03 04 05=[Bytestelle]
67 03 55 5C 70 56 ist die Zahl mit der der pin addiert werden muss

die berechnete Antwort im SendObdCommand wenn Pin=114 ist:
00 01 02 03 04 05=[Bytestelle]
27 04 55 5C 84 57 wird verdreht addiert und gesendet
27 04 55 5C 71 6A wäre aber richtig

was mache ich falsch?
 
Zuletzt bearbeitet:
Zurück