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 ;)
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.
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 :/
Osti schrieb: > IndexOutOfRangeException dann bekommst du scheinbar weniger als 44 zeichen damit geht das hier schief: power = (b[44] << 8) + b[43];
du brauchst ein übertragungsprotokol und musst dir einen disptacher bauen, der die daten extrahiert...und auf fehler prüft...
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.
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?
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.
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.
__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? ;)
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..
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
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.
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..
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.
Wie mach ich das nochmal schnell , dass ich den immer wieder neu überschreibe? Oder, wie wäre es am besten, dass ich es mache?
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 ); }
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 :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.