www.mikrocontroller.net

Forum: PC Hard- und Software C# UART auslesen


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Osti (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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 ;)

Autor: Peter II (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Osti (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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 :/

Autor: Peter II (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Osti schrieb:
> IndexOutOfRangeException

dann bekommst du scheinbar weniger als 44 zeichen damit geht das hier 
schief:

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

Autor: Osti (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Ich weiß, nur ich hab keine Idee wie ich das dann machen sollte..

Autor: Osti (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
hat keiner eine Idee?

Autor: Andi D. (xaos)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
du brauchst ein übertragungsprotokol und musst dir einen disptacher 
bauen, der die daten extrahiert...und auf fehler prüft...

Autor: Peter II (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
das ist genau das Prblem wie schon hier beschrieben

Beitrag "C# Serielle kommunikation - bin datei transferieren."

du musst erst das Protokoll verstehen, bevor du etwas anfängst zu 
Programmieren. Dazu gehört zu erkennen wie lang die Daten sind.

Autor: Osti (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Ich weiß wie lang die Daten sind, nur kann ich sie nicht alle 
speichern..

Kannst du mir vielleicht den Programmcode schreiben, damit ich mehr als 
die 8 Zeichen speichern kann?

Autor: __tom (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Peter II (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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.

Autor: Osti (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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? ;)

Autor: Osti (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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..

Autor: Peter II (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
weil nicht alle 44 byte auf einmal ankommen

Autor: Osti (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Peter II schrieb:
> weil nicht alle 44 byte auf einmal ankommen

ja, aber gleich hintereinander ;)

Autor: Peter II (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Peter II (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
nachtrag:

könnte sein das das aber eh nicht geht, weil der buffer nicht so gross 
ist. Dann musst du solange in das gleiche array einlesen bis dort 44 
byte drin sein.

Autor: Osti (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Aber ich habe vorher den Wert in BytesToRead ausgegeben..
Und er ist nie über 8 gewesen, egal wie viel ich gesendet habe.

Deswegen denke ich, dass das so nicht funktionieren wird..

Autor: Peter II (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Osti schrieb:
> Und er ist nie über 8 gewesen, egal wie viel ich gesendet habe.

naja dann gib es halt nur einen 8 byte buffer. Dann muss du so lange bis 
maximal 8 byte einlesen bis du 44 byte zusammenhast.

Autor: Osti (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Wie mach ich das nochmal schnell , dass ich den immer wieder neu 
überschreibe?

Oder, wie wäre es am besten, dass ich es mache?

Autor: Peter II (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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 
);
}

Autor: Osti (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net