www.mikrocontroller.net

Forum: PC-Programmierung Aktualisierung einer WPF-Anwendung


Autor: Tim G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin relativ neu in der Anwendung von WPF/C#.
Bei meiner Anwendung geht es um das Auslesen via serieller 
Schnittstelle.
Mit einer Konsolenanwendung habe ich das Auslesen bereits programmiert.
Nun wollte ich die Methoden (leicht abgeändert) in mein WPF Projekt 
einfügen, sodass auf der GUI immer die geänderten Werte z.B. in einer 
Textbox angezeigt werden. Hierdrin liegt das Problem.
Ich habe keine Ahnung wie ich diese immmer wieder aktualisierten Werte 
in die Anwendung einbinden kann, bzw. dass sich die Anwendung diese 
Werte immer wieder neu holt.

Sagen wir einfach, ich drehe an einem Potentiometer und die Änderung 
wird dann an der USB-Schnittstelle rausgeschickt. Diese Änderung 
erhöht/erniedrigt einen bestimmten Wert, der nun in der Textbox 
angezeigt werden soll.

Hat jemand eine Lösung?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tim G. schrieb:

> Hat jemand eine Lösung?

Ja.
Hänge nicht an der Methode fest, die du bei einer Konsolenanwendung 
benutzt hast, sondern passe dich an die Programmierweise unter C# an. 
Alles andere ist sonst nämlich ein Kampf gegen Windmühlen.

Es gibt eine Klasse für serielle Schnittstellen. Und ein Objekt davon 
empfängt einen Event, wenn sich an der Schnittstelle etwas tut.

Google ist dein Freund. Und nein, du bist nicht der Erste, der mit C# an 
die Serielle ran will.

Autor: Tim G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so schaut grad mein Programm aus. ist ein kleines großes durcheinander.
bei mir haperts jetzt nur daran, dass er zwar die methode MainWindow 
durchläuft, nur er soll danach die anderen Methoden immer wieder 
aufrufen und das bekomme ich leider nicht hin.




public partial class MainWindow : Window
    {
        SerialPort port = new SerialPort("COM1", 57600, Parity.None, 8, 
StopBits.One);

        [...]

        public MainWindow()
        {
            InitializeComponent();
            stRding();
            port.DataReceived += new 
SerialDataReceivedEventHandler(DataAnalyse);
            stpRding();
        }

        private void stRding()
        {
            port.RtsEnable = true;
            port.Encoding = Encoding.Default;
            port.Open();
        }

        private void stpRding()
        {
            port.Close();
        }

        private void DataAnalyse(object sender, 
SerialDataReceivedEventArgs e)
        {
            string rdata = port.ReadExisting().ToString();

            StringBuilder sb = new StringBuilder();

            foreach (char c in rdata)
            {
                sb.Append(Convert.ToString(c, 16));
            }

            string hex_string = sb.ToString();
            int hex_l = hex_string.Length;
            string element = "";
            string data = "";
            int el_ident = 0;

            #region Elements

            if ((hex_l > 4) && (hex_l < 7))
            {
                element = hex_string[0].ToString() + 
hex_string[1].ToString();
                if (hex_l >= 6)
                {
                    data = hex_string[5].ToString()
                         + hex_string[4].ToString()
                         + hex_string[3].ToString();
                    int i = 0;
                    string[] el_data = new string[16];
                    string[] sel_element = new string[16];

                    #region Jogwheel_right
                    el_ident = String.Compare("3f", element);
                    if (el_ident == 0)
                    {
                        switch (hex_string[hex_l - 2])
                        {
                            case '1':
                                jogwheel_right -= 1;
                                break;
                            case '3':
                                jogwheel_right += 1;
                                break;
                        }

                    }
                    sel_element[i] = "Jogwheel_rechts";
                    el_data[i] = jogwheel_right.ToString();
                    textBox7.Text = el_data[i];
                    i++;

                    #endregio

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tim G. schrieb:
> Hallo,
>
> ich bin relativ neu in der Anwendung von WPF/C#.
> Bei meiner Anwendung geht es um das Auslesen via serieller
> Schnittstelle.
> Mit einer Konsolenanwendung habe ich das Auslesen bereits programmiert.
> Nun wollte ich die Methoden (leicht abgeändert) in mein WPF Projekt
> einfügen, sodass auf der GUI immer die geänderten Werte z.B. in einer
> Textbox angezeigt werden. Hierdrin liegt das Problem.
> Ich habe keine Ahnung wie ich diese immmer wieder aktualisierten Werte
> in die Anwendung einbinden kann, bzw. dass sich die Anwendung diese
> Werte immer wieder neu holt.

Entweder wie "früher" alles per Code ala myTextBox.Text = "abcdefg" oder 
per DataBinding, kleines Beispiel
// die Datenquelle
public class MyDataSource {
    string mString = "abcdefg";
    public string AProperty { 
        get { return mString; } 
        set { mString = value; } }
    public MyDataSource(string s) {
        mString = s;
    }
}
der Rest ist XAML
Binding festlegen (textBox1.Text an MyAppDataSource.AProperty, in beide 
Richtungen, autom. wenn es geändert wird)
<TextBox Height="50" HorizontalAlignment="Left" Margin="0,0,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" 
                 Text="{Binding Source={StaticResource MyAppDataSource}, Path=AProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
Jetzt fehlt noch die Verknüpfung von MyAppDataSource mit der "echten" 
(hier in App.xaml)
Es wird hier autom. eine Instanz von MyDataSource erzeugt
(im Programm geht das mit textBox1.DataContext = myDataSourceInstance)
<Application ...
    xmlns:src="clr-namespace:MyAppNamespace"
    xmlns:system="clr-namespace:System;assembly=mscorlib" 
    ... >
    <Application.Resources>
        <ObjectDataProvider x:Key="MyAppDataSource"
                        ObjectType="{x:Type src:MyDataSource}" />  
            <ObjectDataProvider.ConstructorParameters>              
                <system:String>Test constructor parameter</system:String>
            </ObjectDataProvider.ConstructorParameters> 
        </ObjectDataProvider>  
    </Application.Resources>
</Application>


>
> Sagen wir einfach, ich drehe an einem Potentiometer und die Änderung
> wird dann an der USB-Schnittstelle rausgeschickt. Diese Änderung
> erhöht/erniedrigt einen bestimmten Wert, der nun in der Textbox
> angezeigt werden soll.
>
> Hat jemand eine Lösung?

http://msdn.microsoft.com/en-us/library/aa480224.aspx
http://msdn.microsoft.com/en-us/library/aa480226.aspx
http://bea.stollnitz.com/blog/?p=22
http://blogs.msdn.com/wpfsdk/archive/2006/10/19/wp...
http://www.codeproject.com/KB/WPF/MovingTowardWpfB...

> so schaut grad mein Programm aus. ist ein kleines großes durcheinander.
> bei mir haperts jetzt nur daran, dass er zwar die methode MainWindow
> durchläuft, nur er soll danach die anderen Methoden immer wieder
> aufrufen und das bekomme ich leider nicht hin.

DataReceived ist ein Event, das autom. ausgelöst wird, wenn Daten 
ankommen (passendes ReceivedBytesThreshold und Encoding nicht 
vergessen).
Zudem ist hier die übliche Baustelle wieder eröffnet:
Wenn UI-Elemente aus einem anderen Thread (hier DataReceived) geändert 
werden sollen, muss dies über Invoke im UI-Thread gemacht werden
// im DataReceived-Handler
// im gleichen Thread
if (textBox1.Dispatcher.CheckAccess()) {
   textBox1.Text = "abcdefg";
} else {
   // Update wird aus einem anderen Thread gestartet
   textBox1.Dispatcher.Invoke(DispatcherPriority.Normal, MyUpdateDelegate);
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.