Forum: PC-Programmierung Bytes sortieren - Visual C#


von Herbert H. (Gast)


Angehängte Dateien:

Lesenswert?

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
von Klaus R. (klara)


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

von Eddy C. (chrisi)


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.

von Arc N. (arc)


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(...)

von Klaus R. (klara)


Lesenswert?

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

von Herbert H. (Gast)


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?

von Eric B. (beric)


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.

: Bearbeitet durch User
von Herbert H. (Gast)


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.

von Klaus R. (klara)


Lesenswert?

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

von Herbert H. (Gast)


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.

von Herbert H. (Gast)


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?

von Herbert H. (Gast)


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!

von Herbert H. (Gast)


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?

von Klaus R. (klara)


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

: Bearbeitet durch User
von Karl H. (kbuchegg)


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

von Klaus R. (klara)


Lesenswert?

OK, habe ich so überlesen. Der Lösungsansatz sollte passen.
mfg klaus

von Arc N. (arc)


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));

von Mathias O. (m-obi)


Lesenswert?

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.

von Eric B. (beric)


Lesenswert?

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

von Mathias O. (m-obi)


Lesenswert?

Danke.

von Herbert H. (Gast)


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..

von Mathias O. (m-obi)


Lesenswert?

Hört sich an, nach einem Speicherleck. Code?

von Klaus R. (klara)


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

von Klaus R. (klara)


Lesenswert?

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

von Mathias O. (m-obi)


Lesenswert?

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
Noch kein Account? Hier anmelden.