Hallo, Ich empfange von der Seriellen Schnittstelle folgende Daten (siehe Bild). Wie kann ich diese gescheit in div. TextBoxen einordnen? Nach jedem Byte bekomme ich ein "\n". Freue mich auf Antworten.
:
Verschoben durch Moderator
Herbert H. schrieb: > Hallo, > > Ich empfange von der Seriellen Schnittstelle folgende Daten (siehe > Bild). > Wie kann ich diese gescheit in div. TextBoxen einordnen? > Nach jedem Byte bekomme ich ein "\n". > > Freue mich auf Antworten. Wie soll denn jemand wissen nach welchen Kriterien Du ordnen willst? Im Betreff sprichst Du ja schon von sortieren. Dann sortiere. Unter VC# ist das ja wohl kein Problem. mfg klaus
Es sieht eher so aus, dass Du eine ASCII-kodierte Zeile erhältst ("Textzeile"), welche mit einen Zeilenvorschub endet. Die Zeile enthält mehrere Dezimalzahlen, welche durch Leerzeichen getrennt sind. Jetzt erkläre uns, was der Screenshot mit Deinen "Bytes" zu tun haben soll.
Herbert H. schrieb: > Wie kann ich diese gescheit in div. TextBoxen einordnen? > Nach jedem Byte bekomme ich ein "\n". Irgendwas passt da nicht bzw. sieht das eher danach aus, als ob nach jeder Zeile ein \n kommt und davor ASCII Leerzeichen und Zahlen...
1 | |
2 | var line = "0 0 65154 11 0\n"; |
3 | var separators = new string[] {" ", "\n" }; |
4 | var split = line.Split(separators, StringSplitOptions.RemoveEmptyEntries); |
5 | if (split.Length != 5) // something went wrong |
6 | var intArray = split.ConvertAll(...) |
Meine Glaskugel ist noch ziemlich trübe. Vielleicht erzählt und Herbert mal wer die Daten liefert und was er erhofft zu sehen. Das könnte helfen. mfg Klaus
Hallo, die Daten bekomme ich von einem µC. Dieser Wertet 3 x PortExpander aus. Dort sind Fototransistoren angeschlossen, die überprüfen ob LED´s leuchten oder nicht. Dieses wollte ich jetzt in meinem Programm auswerten. Für jeden Expander eine ListBox. Dort sollen dann die Werte für die "LED´s" landen. Das Programm auf dem µC sieht so aus :
1 | /* aviable I2C Devices? */
|
2 | aviable_I2C_Chips(); // all I2C Chips online? |
3 | |
4 | /* read the 16 Input Bit´s from Chip one */
|
5 | Info_Tmp = readGPIOAB(MCP23017_I); // read MCP23017 I |
6 | sprintf(Buffer, "%u ", Info_Tmp); // Integer to ASCII |
7 | uart_puts(Buffer); // UART out |
8 | uart_puts("\n"); |
9 | |
10 | // /* read the 16 Input Bit´s from Chip two */
|
11 | // Info_Tmp = readGPIOAB(MCP23017_II); // read MCP23017 II
|
12 | // sprintf(Buffer, "%u ", Info_Tmp); // Integer to ASCII
|
13 | // uart_puts(Buffer); // UART out
|
14 | // uart_puts("\n");
|
15 | //
|
16 | // /* read the 16 Input Bit´s from Chip three */
|
17 | // Info_Tmp = readGPIOAB(MCP23017_III); // read MCP23017 III
|
18 | // sprintf(Buffer, "%u ", Info_Tmp); // Integer to ASCII
|
19 | // uart_puts(Buffer); // UART out
|
20 | // uart_puts("\n");
|
21 | //
|
22 | // /* read the Sensors direct on the µC */
|
23 | // Info_Tmp = PIND; // read logic level @ PIND
|
24 | // Info_Tmp = (Info_Tmp & 0b01110000); // mask the result
|
25 | // Info_Tmp = Info_Tmp >> 4; // result = 0b00000111
|
26 | // sprintf(Buffer, "%u ", Info_Tmp); // integer to ASCII
|
27 | // uart_puts(Buffer); // UART out
|
28 | // uart_puts("\n");
|
Versteht ihr was ich meine?
Herbert H. schrieb:
>
1 | > /* aviable I2C Devices? */ |
2 | > aviable_I2C_Chips(); // all I2C Chips online? |
3 | >
|
4 | > /* read the 16 Input Bit´s from Chip one */ |
5 | > Info_Tmp = readGPIOAB(MCP23017_I); // read MCP23017 I |
6 | > sprintf(Buffer, "%u ", Info_Tmp); // Integer to ASCII |
7 | > uart_puts(Buffer); // UART out |
8 | > uart_puts("\n"); |
9 | >
|
10 | > // /* read the 16 Input Bit´s from Chip two */ |
11 | > ... |
12 | >
|
> > Versteht ihr was ich meine? Das passt schon mal nicht zu dem Screenshot. Es sei den der hier auskommentierte code War nicht auskommentiert.
:
Bearbeitet durch User
Eric B. schrieb: > Das passt schon mal nicht zu dem Screenshot. Es sei den der hier > auskommentierte code War nicht auskommentiert. Ich habe gestern noch ein bisschen rum probiert und habe nach jeder UART Ausgabe ein "\n" mit gesendet. Ich dachte das erleichtert nacher das sortieren. Bei dem Screenshot war nichts auskommentiert.
Hallo Herbert, so, wo kommst Du denn nicht weiter? Wenn ich jetzt mal Deine Hardcopy nehme, hast Du Zeilen mit mehreren Werten je Zeile. Um jetzt die Werte weiter zu verarbeiten, kannst Du die Methode String.Split verwenden. https://msdn.microsoft.com/en-us/library/system.string.split%28v=vs.110%29.aspx Dein Trennzeichen ist das Leerzeichen. mfg Klaus
Klaus R. schrieb: > Hallo Herbert, > so, wo kommst Du denn nicht weiter? Wenn ich jetzt mal Deine Hardcopy > nehme, hast Du Zeilen mit mehreren Werten je Zeile. Um jetzt die Werte > weiter zu verarbeiten, kannst Du die Methode String.Split verwenden. > > https://msdn.microsoft.com/en-us/library/system.string.split%28v=vs.110%29.aspx > > Dein Trennzeichen ist das Leerzeichen. > mfg Klaus Hallo Klaus, ich werde es heute abend direkt mal versuchen.
Arc N. schrieb: > var line = "0 0 65154 11 0\n"; > var separators = new string[] {" ", "\n" }; > var split = line.Split(separators, > StringSplitOptions.RemoveEmptyEntries); > if (split.Length != 5) // something went wrong > var intArray = split.ConvertAll(...) Wie genau funktioniert diese Funktion? Wo stehen jetzt meine einzelnen Bytes?
Herbert H. schrieb: > Arc N. schrieb: >> var line = "0 0 65154 11 0\n"; >> var separators = new string[] {" ", "\n" }; >> var split = line.Split(separators, >> StringSplitOptions.RemoveEmptyEntries); >> if (split.Length != 5) // something went wrong >> var intArray = split.ConvertAll(...) > > Wie genau funktioniert diese Funktion? > Wo stehen jetzt meine einzelnen Bytes? Ich habe es verstanden. Genau das habe ich gesucht. Danke!
Jetzt habe ich nur noch das Problem, dass meine Bytes ja nicht als "String" der Funktion übergeben werden. So kommt es natürlich zu einem Fehler.
1 | void UpdateTheTextbox(string s) |
2 | {
|
3 | |
4 | MessageBox.Show(s); |
5 | var line = s; |
6 | var separators = new string[] { " ", "\n" }; |
7 | var split = line.Split(separators, StringSplitOptions.RemoveEmptyEntries); |
8 | |
9 | |
10 | slaves.Items.Add(split[3]); |
11 | slaves.SelectedIndex = (slaves.Items.Count - 1); |
12 | |
13 | Expander_1.Items.Add(split[0]); |
14 | Expander_1.SelectedIndex = (Expander_1.Items.Count - 1); |
15 | |
16 | Expander_2.Items.Add(split[1]); |
17 | Expander_2.SelectedIndex = (Expander_2.Items.Count - 1); |
18 | |
19 | Expander_3.Items.Add(split[2]); |
20 | Expander_3.SelectedIndex = (Expander_3.Items.Count - 1); |
21 | |
22 | IO_MEGA32.Items.Add (split[4]); |
23 | IO_MEGA32.SelectedIndex = (IO_MEGA32.Items.Count - 1); |
24 | |
25 | |
26 | }
|
Wie könnte ich das noch lösen?
Herbert H. schrieb: > Jetzt habe ich nur noch das Problem, dass meine Bytes ja nicht als > "String" der Funktion übergeben werden. So kommt es natürlich zu einem > Fehler. > > Wie könnte ich das noch lösen? Du programmierst noch nicht so lange? In der Regel war ich es gewohnt das mir ein VC# - Programmierer beibrachte was für Tiefen es alles da gibt. Insofern ist C# schon eine gute Wahl. Google ist hier (mal ausnahmsweise) Dein Freund: vc# byte to string Das Suchen über Google ist in der Regel effektiver als irgendeine Mircosoft-Hilfe. Allerdings weiss Google dann auch wo Deine Lücken sind. Der Einsatz von BING wäre hier wohl gescheiter. Also, willkommen in der Welt der Programmierer. In Deinem aktuellen Fall brauchst Du eine Typkonvertierung. https://msdn.microsoft.com/en-us/library/system.convert.tostring%28v=vs.110%29.aspx mfg klaus
:
Bearbeitet durch User
Klaus R. schrieb: > Google ist hier (mal ausnahmsweise) Dein Freund: vc# byte to string anders rum. Er hatte ursprünglich einen kompletten String. Den hat er in 3 Teilstrings aufgebrochen und braucht jetzt die in diesen Teilstrings als Text dargestellten Zahln in ihrer tatsächlichen Binärform. (Warum auch immer. Rein nur zu Anzeigezwecken würde man das nicht benötigen) Was er also braucht ist die Konvertierung von String->Integer
OK, habe ich so überlesen. Der Lösungsansatz sollte passen. mfg klaus
Herbert H. schrieb: > Jetzt habe ich nur noch das Problem, dass meine Bytes ja nicht als > "String" der Funktion übergeben werden. So kommt es natürlich zu einem > Fehler. Zu welchem? Und was ist was? Wenn da z.B. "0 0 65154 11 0\n" ankommt, sind das alles uint16_t, ints mit 16-Bit und was soll es auf dem PC werden? Ebenso uint16_t? Falls letzteres z.B.
1 | for (int i = 0; i < split.Length; i++) { |
2 | uInt16Array[i] = Convert.ToUInt16(split[i]); |
3 | // oder wenn es keine Exception werfen soll, falls das Umwandeln
|
4 | // schief geht:
|
5 | var converted = UInt16.TryParse(split[i], out uInt16Array[i]); |
6 | }
|
7 | // oder alles auf einmal
|
8 | // (oben war da ein Fehler: nicht split.ConvertAll sondern)
|
9 | var uArray = Array.ConvertAll(split, item => Convert.ToUInt16(item)); |
Herbert H. schrieb: > Das Programm auf dem µC sieht so aus : > /* aviable I2C Devices? */ > aviable_I2C_Chips(); // all I2C Chips online? Das heißt übriegens available.
Mathias O. schrieb: > Herbert H. schrieb: >> Das Programm auf dem µC sieht so aus : >> /* aviable I2C Devices? */ >> aviable_I2C_Chips(); // all I2C Chips online? > > Das heißt übriegens available. Übrigens :-P
Hallo Leute, ich habe das mit dem einlesen hin bekommen. Landet jetzt alles dort wo es sein soll. Nur beim schließen der Schnittstelle wird die Form nicht geschlossen und reagiert irgendwie nicht mehr. Hmm..
Herbert H. schrieb: > > Nur beim schließen der Schnittstelle wird die Form nicht geschlossen und > reagiert irgendwie nicht mehr. Hmm.. Dann zeig mal Deinen Code. Mit Schnittstelle meinst Du die serielle Schnittstelle? In der Regel initialisiert man die und empfängt über ein Event. Man sollte sie aber besser in einem eigenen Thread laufen lassen, um die GUI nicht zu behindern. Die Form dürfte die GUI sein. Wie gesagt, zeig mal den Code. mfg klaus
Mathias O. schrieb: > Hört sich an, nach einem Speicherleck. Code? Würde ich unter VC# mit ziemlicher Sicherheit ausschliessen. So etwas gab es ganz, ganz früher mal. mfg klaus
Komme aus der C++ Ecke. Da kann sowas schon mal vorkommen, wenn man nicht aufpasst.
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.