Bonjour à tous,
Alors d'abord merci de m'avoir adopté !
Je souhaiterais avoir quelques conseils sur la conception d'une interface en C#.
Je m'explique, je réalise cette interface pour regrouper tout les tests que j’effectue sur une carte Arduino (équipée d'un module quelconque, disons un module GSM) car ça devient un peu fatiguant d'utiliser le moniteur série d'Arduino. En gros mon interface me permettrait d'envoyer des commandes (du style "AT+IPR=115200") à l'aide de boutons et de recevoir une réponse du microcontrôleur dans une textbox. Après avoir souffert quelques jours sur la partie communication série en C# mon programme fonctionne, enfin... J'arrive à :
-Envoyer une commande à mon Arduino sur le bus série depuis mon winform.
-Réceptionner cette commande avec un programme préalablement téléversé sur mon Arduino.
-Renvoyer cette commande sur le bus série pour faire un simple echo (pour tester) avec le même programme préalablement téléversé.
-Récupérer l'echo sur le winform (l'afficher dans une textbox).
J'ai un peu de mal avec le C# mais pour le coup j'ai pas trop le choix du langage...
En fait j'aurais voulu savoir si quelqu'un connaissait un moyen propre de faire d'un textbox une sorte de console de logging, qui pourrait donner quelque chose comme ceci :
>Attente d'une commande...
>Envoi de la commande : AT+IPR=115200
>Le module GSM à répondu : OK
>Attente d'une commande...
Je n'arrive pas à conserver le contenu de la textbox, à chaque fois que je clique sur mon bouton elle se vide.
Pourtant mon test textBox1.AppendText("coucou"); ligne 36 ne clear pas la textbox (AppendText ajoute du texte non ?).
J'ai l'impression de m'embrouiller dans le code je ne sais pas très précisément qu'est-ce qui fait quoi et quand...
J'ai également rendu thread-safe tout mon petit truc mais j'ai l'impression de l'avoir fait de 2 manières différentes à deux endroits différents, si quelqu'un peut également m'éclaircir sur ce point ce serait super.
A terme, quelle organisation vais-je devoir adopter au niveau de ma classe Form1 s'il y a 36 commandes pour 4 modules différents ?
J'ai peur que ce soit un peu chiant d'avoir 36 boutons, même si c'est juste une interface de tests...
Merci à tous pour votre patience !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO.Ports; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace SerialTestInterface { public partial class Form1 : Form { SerialPort Serial; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //New SerialPort nammed Serial Serial = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One); //Event Handler that specify a method to use when the event append this.Serial.DataReceived += new SerialDataReceivedEventHandler(this.Serial1_DataReceived); this.Serial.Open(); } //Here we send "AT" to Serial1 private void button1_Click(object sender, EventArgs e) { this.Serial.Write("AT" + Environment.NewLine); //textBox1.AppendText("coucou"); } private void button2_Click(object sender, EventArgs e) { this.Serial.Write("GSMAT" + Environment.NewLine); } //This method is called when the event append private void Serial1_DataReceived(object sender, SerialDataReceivedEventArgs e) { var InputData = this.Serial.ReadLine(); var Text = InputData; System.Diagnostics.Debug.Write(InputData + Environment.NewLine); try { textBox1.AppendText(Text); } catch (InvalidOperationException exception) { System.Diagnostics.Debug.Write(exception.Message); Action t = () => { AppendTextBox1(InputData); textBox1_TextChanged(sender, e); }; textBox1.BeginInvoke(t); } } private void textBox1_TextChanged(object sender, EventArgs e){ var InputData = this.Serial.ReadLine(); var Text = InputData; } // This delegate enables asynchronous calls for setting // the text property on a TextBox control. delegate void AppendTextBox1CallBack(string text); public void AppendTextBox1(string txt) { // InvokeRequired required compares the thread ID of the // calling thread to the thread ID of the creating thread. // If these threads are different, it returns true. if (this.textBox1.InvokeRequired) { AppendTextBox1CallBack d = new AppendTextBox1CallBack(AppendTextBox1); this.Invoke(d, new object[] { txt }); } else { this.textBox1.Text = txt; } } } }
Partager