C# UART auslesen

Gast #2665565
Lesenswert?

Ich verwende den Mini2440 mit WinCE

Ich habe folgenden Code:

            int bytesToRead;
            string acpower;
            int power;
            bytesToRead = serialPort1.BytesToRead;

            byte[] b = new byte[bytesToRead];

            serialPort1.Read(b, 0, bytesToRead);

            power = (b[44] << 8) + b[43];

            acpower = power.ToString();

            textBox1.Text = acpower;

Nur dieser funktioniert nur, wenn ich nicht über 8 Hex-Zahlen sende..
Jedoch gibt es einen Error, wenn ich z.b. 94 Hex-Zahlen senden will.
Es wird zwar noch der richtige Wert berechnet, aber es kommt sofort ein 
Error und ich muss das Programm schließen.

Was kann ich tun, damit ich mehr als nur die 8 Hex-Werte einlesen kann?


Danke schon einmal im vorhinein ;)
Gast #2665582
Lesenswert?

Osti schrieb:
> aber es kommt sofort ein
> Error und ich muss das Programm schließen.

und welcher fehler kommt? du musst fehler mit Try Catch abfangen. Und 
wie schon im anderen Thread geschrieben ist der puffer von RS232 nicht 
so gross das dort 90 zeichen reinpassen - du musst ständig diese daten 
abfragen.
Gast #2665589
Lesenswert?

Ich habe die App am Mikrocontroller laufen..

Error
An unexpected error has occurred in Serialexample.exe
Select Quiet and then restart this program, or select Details for more 
information.

Details:
Error
Serialexample.exe
IndexOutOfRangeException

at
...


Aber ich bekomme auf einmal 94 Zeichen :/
Gast #2665699
Lesenswert?

Osti schrieb:
> Ich weiß wie lang die Daten sind,

Du vielleicht, die Anwendung weiss es nicht. BytesToRead gibt dir die 
Anzahl an Bytes im Puffer zurück, das kann im Extremfall auch nur 1 Byte 
sein, dann kracht dir:

power = (b[44] << 8) + b[43];

gegen die Wand.
Gast #2665714
Lesenswert?

__tom schrieb:
> Osti schrieb:
>> Ich weiß wie lang die Daten sind,
>
> Du vielleicht, die Anwendung weiss es nicht. BytesToRead gibt dir die
> Anzahl an Bytes im Puffer zurück, das kann im Extremfall auch nur 1 Byte
> sein, dann kracht dir:
>
> power = (b[44] << 8) + b[43];
>
> gegen die Wand.

Ich habe schon versucht die "BytesToRead" auszugeben.. und ab 8 Werten 
fangen diese wieder bei 1 an..

Und wie kann ich das dem Programm sagen, dass das 94 Zeichen sein 
sollten? ;)
Gast #2665717
Lesenswert?

Peter II schrieb:
> Osti schrieb:
>> Kannst du mir vielleicht den Programmcode schreiben, damit ich mehr als
>> die 8 Zeichen speichern kann?
>
> dein Programm ist dafür richtig, das Problem ist das zu dem zeitpunkt
> des aufrufens scheinbar keine 8 byte da sind.

Ich habe es damit versucht den Wert innerhalb den ersten 8Byte zu 
berechen:

power = (b[1] << 8) + b[0];

das hat super funktioniert, egal wie viel ich gesendet habe..

jedoch funktioniert das mit power = (b[44] << 8) + b[43]; nicht mehr..
Gast #2665740
Lesenswert?

Osti schrieb:
> ja, aber gleich hintereinander ;)

naja dann bau jdoch eine schleife ringsrum

while ( serialPort1.BytesToRead < 44 ) {
   Sleep(10);
}

//jetzt einlesen

aber schön ist das auf jeden Fall nicht, wenn jetzt keine daten kommen, 
das hängt dein Programm fest
Gast #2665772
Lesenswert?

so in der art

int bytesToRead = 45;
int bytesRead = 0;

byte[] b = new byte[bytesToRead];
while ( bytesRead < bytesToRead ) {
  bytesRead += serialPort1.Read(b, bytesRead , bytesToRead - bytesRead 
);
}
Gast #2665785
Lesenswert?

ja, das funktioniert super :)

Ich muss halt jz schauen, wie viele Bytes ich insgesamt bekomme und das 
darauf anpassen ;)

Ich schau noch schnell, ob ich das jz auch noch hin bekomme.

Danke vielmals :)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren