none
Zahlenreihe auflösen

    Frage

  • Hallo zusammen,
    ich bin gerade dabei die CPU- Auslastung meines PC's via USB auf mein Arduino zu spielen, damit er sie auf seinem LCD-Bildschirm anzeigt (Bsp.: "CPU: 35%").
    Das Problem ist nur leider, dass der PC dem Arduino nur einzelne Zahlen und keine Zahlenreihe schicken kann.
    Nun muss ich die prozentualen Werte (Bsp.: "35") in einzelne Integer-Zahlen trennen ("0", "3" und "5").

    Hat Jemand eine Idee wie ich dann eine dreistellige Zahl teilen kann?!

    Danke im voraus ;)

    Gruß

    Julian

    Montag, 19. August 2013 16:58

Antworten

  • In VB.NET sieht die Funktion so aus:
        Function GetDigits(i As Byte) As Byte()
            Dim r1 As Byte = CByte(i \ 100)'1. Stelle
            Dim r2 As Byte = CByte((i - r1 * 100) \ 10)'1. Stelle abziehen (*100)
            Dim r3 As Byte = CByte(i - r1 * 100 - r2 * 10)'1. und 2. Stelle abziehen
            Return New Byte() {r1, r2, r3}'Neues Array mit den Ziffern
        End Function

    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert ZuseZ Dienstag, 20. August 2013 16:53
    Dienstag, 20. August 2013 07:14

Alle Antworten

  • Hallo, die Zahl kannst du auf mehrere wege "aufsplitten". Einerseits kannstr du die Zahl mittels ToString in eiune Zeichenfolge wandeln und dann Zeichen für Zeichen durchgehen. Ich denke aaber, das nachfolgende Methode ffizienter arbeitet:

            static byte[] GetDigits(byte i)
            {
                byte r1 = (byte)(i / 100);//1. Stelle
                byte r2 = (byte)((i - r1 * 100) / 10); //1. Stelle abziehen (*100)
                byte r3 = (byte)(i - r1 * 100 - r2 * 10); //1. und 2. Stelle abziehen
    
                return new byte[] { r1, r2, r3 };//Neues Array mit den Ziffern
            }

    Ich weiß nun nicht in welchem Format dein Arduino die Daten haben will oder wie du diese bekommst. Unter Umständen bekommst du beim auslesen nämlich Werte zwischen 0 und 1, die musst du dann vorher noch mit 100 multiplizieren.

    Bist du dir sicher, das du nur einzelne Ziffern von 0 bis 9 übergeben kannst? Das halte ich für etwas seltsam, da Computer meistens auf irgendetwas mit 2er-Potenzen aufbauen (2, 4, 8, 16, ...). Außerdem würde bereits ein Byte über 100% abdecken.


    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert ZuseZ Montag, 19. August 2013 21:07
    • Tag als Antwort aufgehoben ZuseZ Montag, 19. August 2013 21:08
    Montag, 19. August 2013 17:22
  • Danke für die schnelle Antwort :),
    jedoch deklariert mir die Arduino ide folgenden Code:
    static byte[] GetDigits(byte i)

    Was soll ich tun?

    Mir selbst sind noch nicht viele Wege bekannt dieses Problem zu lösen. Mein bisheriger Code sieht so aus:

    void loop() {
      if (Serial.available())
      {
        char data1 = Serial.read();
        while(!Serial.available()) {}
        char data2 = Serial.read();
        while(!Serial.available()) {}
        char data3 = Serial.read();
        while(!Serial.available()) {}
        char data4 = Serial.read();
        while(!Serial.available()) {}
        char data5 = Serial.read();
        while(!Serial.available()) {}
        char data6 = Serial.read();
    
        // CPU-Auslastung
        lcd.setCursor(0, 0);
        lcd.print(data1);
        lcd.print(data2);
        lcd.print(data3);
    
        // RAM-Auslastung
        lcd.setCursor(0, 1);
        lcd.print(data4);
        lcd.print(data5);
        lcd.print(data6);    
        }
    }

    Noch ist der Code im Embryostadium; also nicht wundern, wenn noch kleinigkeiten fehlen. Mit dem "seriellen Monitor" konnte ich das Programm schon mit erfolg testen. Mir bereitet Visual Basic nur noch Probleme :/.



    Mir ist nur noch eine andere Möglichgeit bekannt, die leider einen kleinen Haken hat:

    Ich kann meines Wissens nach die Case-Werte von 1 bis 1023 beliebig konfigurieren. Das besagte Problem ist nur, dass ich so jede Zahl auch benennen und konfigurieren müsset. Sprich so:
      switch(SerialData)
      {
        case 10:
        lcd.print("10%"); // in dem Fall 10% der CPU-Auslastung
        break;
    
        case 11:
        lcd.print("11%");
        break;
    
        case 12:
        lcd.print("12%");
        break;
    
        usw...
      }
    Das währe sehr aufwändig und nimmt zudem noch sehr viel Speicherplatz in Bedarf.
    Montag, 19. August 2013 19:53
  • Dein Code ist kein Visual Basic, genauso wenig wie meiner oben. Meiner ist C#. Deiner sieht nach C++ bzw. auch C# aus.

    In C++ müsste meine Methode so aussehen:

    unsigned char* GetDigits(unsigned char i)
    {
    	unsigned char r1 = (unsigned char)(i / 100);//1. Stelle
    	unsigned char r2 = (unsigned char)((i - r1 * 100) / 10); //1. Stelle abziehen (*100)
    	unsigned char r3 = (unsigned char)(i - r1 * 100 - r2 * 10); //1. und 2. Stelle abziehen
    
    	unsigned char result[3];//Neues Array mit den Ziffern
    	result[0]=r1;
    	result[1]=r2;
    	result[2]=r3;
    	return result;//Array zurück geben
    }

    Ich bin mir da aber nicht zu 100% sicher. Dein Code sagt mir da auch nichts weiter. An Stelle der rießigen Switchabfrage würde es in C# auch so funktionieren:

    lcd.print(SerialData + "%");

    Da SerialData den Wert in sich gespeichert hat muss man dann nurnoch das % dran hängen. Das widerspricht aber dem von dir oben geschriebenem, das du nur einzelne Daten übertragen kannst.

    Bei der Frage nach der Programmiersprache, tippe ich mal auf C++, aber C# ist da auch nicht ausgeschlossen. Für C# oder allgemein .NET kann ich dir weiter helfen, für C++ aber kaum.


    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Montag, 19. August 2013 20:16
  • Oh nein :D
    Entschuldigung! Ich dachte dein Code währe für den Arduino. In Visual Basic hat er nicht funktioniert und bei der Arduino ide (C++) hat nur Dein oberer besagter Teil nicht funktioniert.

    Nein, ich suche nach einem VB Code.
    Wenn du mir dort weiter helfen könntest, währe ich Dir sehr verbunden.

    Montag, 19. August 2013 20:34
  • In VB.NET sieht die Funktion so aus:
        Function GetDigits(i As Byte) As Byte()
            Dim r1 As Byte = CByte(i \ 100)'1. Stelle
            Dim r2 As Byte = CByte((i - r1 * 100) \ 10)'1. Stelle abziehen (*100)
            Dim r3 As Byte = CByte(i - r1 * 100 - r2 * 10)'1. und 2. Stelle abziehen
            Return New Byte() {r1, r2, r3}'Neues Array mit den Ziffern
        End Function

    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert ZuseZ Dienstag, 20. August 2013 16:53
    Dienstag, 20. August 2013 07:14
  • Vielen Dank Tom.
    Ich habe die Function weggelassen und nur den Dim-Teil in das Projekt eingebaut. Jetzt klappt alles.

    Danke :)

    LG
    Julian Baars
    Dienstag, 20. August 2013 16:59