Bytes sortieren - Visual C#

#4343195
Lesenswert?
• ▲
▼
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
#4343263
Lesenswert?
• ▲
▼
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.
#4343276
Lesenswert?
• ▲
▼
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(...)
Gast #4343644
Lesenswert?
• ▲
▼
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?
#4343713
Lesenswert?
• ▲
▼
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.
Gast #4343727
Lesenswert?
• ▲
▼
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.
Gast #4343817
Lesenswert?
• ▲
▼
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.
Gast #4344299
Lesenswert?
• ▲
▼
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?
Gast #4344394
Lesenswert?
• ▲
▼
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!
Gast #4344424
Lesenswert?
• ▲
▼
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?
#4344628
Lesenswert?
• ▲
▼
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
#4344750
Lesenswert?
• ▲
▼
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
#4344973
Lesenswert?
• ▲
▼
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));
Gast #4345699
Lesenswert?
• ▲
▼
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..
#4345873
Lesenswert?
• ▲
▼
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

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