Forum: PC-Programmierung C# Array Felder


von Rolf (Gast)


Lesenswert?

Hallo,

ich verstehe eine Sache mit Arrays unter C# nicht.
Ich habe global ein Array deklariert:

byte[] RxBuffer = new byte[64];

Wenn ich im

private void spModem_DataReceived(object sender, 
System.IO.Ports.SerialDataReceivedEventArgs e)

Das Array fülle bekomme ich zunächt mit serialport.ReadExisting() nur 14 
Felder gefüllt. Das Array ist dann auch nur 14 Felder lang. Ich muss 
aber ein 2. Paket anhängen. Also ab Index 14. Nur schmeist mir der 
Debugger dann eine exception, das Array ware zu klein ??? Das 2. Paket 
ist aber nur ein paar Byte groß. Warum kann ich auf die restlichen 
Felder bis 63 nicht zugreifen?

Gruß
Rolf






IDE: Visual C# 2005 Express Edition

von Peter (Gast)


Lesenswert?

wie liest du denn die Daten ein? Wenn die Read funktion selber ein array 
liefert dann wird deine alte größe damit überschrieben.

von Rolf (Gast)


Lesenswert?

so:
sData = spModem.ReadExisting();
RxBuffer = enc.GetBytes(sData);

von Sam .. (sam1994)


Lesenswert?

Rolf schrieb:
> RxBuffer = enc.GetBytes(sData);

Damit überschreibst du dein Array.
Dein Array ist nun nicht mehr dein Altes, sondern ein neues 14 byte 
langes Array.

Nimm eine List<byte> und nimm die AddRange-Methode oder schreibt dir 
deine Kopiermethode selber:
byte[] temp = enc.GetBytes(sData);
und jetzt kopierst du byte-weise RxBuffer[i] = temp[i]

von Peter (Gast)


Lesenswert?

Rolf schrieb:
> sData = spModem.ReadExisting();
> RxBuffer = enc.GetBytes(sData)

warum geht du den umweg über einen string? lies doch gleich das array 
richtig ein.

http://msdn.microsoft.com/de-de/library/ms143549.aspx

von Rolf (Gast)


Lesenswert?

@Samuel K.
Danke für die Info. Ich kopiere jetzt den String in einen TempBuffer und 
von dort aus stückchenweise, bei jedem neuen Teilempfang, in den 
RxBuffer. So klappts.

@Peter
Man bekommt überall eingebimst das man die ReadExisting() Methode nehmen 
soll. Die gibt nur einen String zurück.

Gruß
Rolf

von Peter (Gast)


Lesenswert?

Rolf schrieb:
> @Peter
> Man bekommt überall eingebimst das man die ReadExisting() Methode nehmen
> soll. Die gibt nur einen String zurück.

nein man sollte das nehmen was für den zweck das richtige ist. Und wenn 
du ein byte array willst dann nimmt man die Read Methode. Man muss ja 
nicht die fehler von anderen nachmachen. Stirngs haben den nachteil das 
sie eine Zeichensatzkonvertierung durchführen. Wenn es also mal kein 
Klartext-Protokoll ist dann geht das schief.

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.