Bonjour,
Je voudrais faire une interface graphique en c# pour communiquer entre un PC et un régulateur mais je suis débutant en ce langage.
Auriez vous une piste pour m'aider s'il vous plait ?
Merci.
Version imprimable
Bonjour,
Je voudrais faire une interface graphique en c# pour communiquer entre un PC et un régulateur mais je suis débutant en ce langage.
Auriez vous une piste pour m'aider s'il vous plait ?
Merci.
Salut,
Il faut regarder du côté de la classe SerialPort :
- http://msdn.microsoft.com/fr-fr/libr...=vs.80%29.aspx
Un exemple détaillé par ici :
http://msmvps.com/blogs/coad/archive...300_-.NET.aspx
bonjour;
j'essai de voir le projet sur le site que vous m'avez envoye mais il ne s'execute pas.
s'il vous plait si vous savez comment corriger les erreurs de compilation de ce projet je serai tres reconnaissante.
merci d'avance
Montre ton code et affiche la liste des erreurs de compilation :mur:
bonjour;
le code est celui du site http://msmvps.com/blogs/coad/archive...300_-.NET.aspx
et le problem c'est que le fichier .exe n'existe pas et lorsque j'essai de creer un nouveau projet lui aussi sa marche pas.
Comment s'appelle ton .exe, depuis où tu le lances ? Créer un nouveau projet ça marche pas, quel message d'erreur ?Citation:
le problem c'est que le fichier .exe n'existe pas et lorsque j'essai de creer un nouveau projet lui aussi sa marche pas
bonjour;
pour le code origine "SerialPortTerminal.zip" que j'ai telechargé du site indique précédamment il me donne l'erreur suivante:
et pour le projet que j'ai créé, il ne donne rien à execution c'est à dire lorsque je l'exécute il ya des boutons qui ne sont pas actifs et j'entre des données rien ne change.Citation:
Error 1 Unable to find manifest signing certificate in the certificate store. SerialPortTerminal
Bonjour,
Je suis arrivé à résoudre les problèmes de compilation mais j'ai un autre problème c'est que les boutons créer dans l'interface ne sont pas actifs c'est à dire lorsque je clic sur le bouton « clear » par exemple rien ce que j’écris ne s’efface pas.
S’il vous plait aidez moi à résoudre ce problème cette partie est la premier étape dans mon projet de fin d'étude et je dois avance vite.
Merci en avance.
voici le code du programme:
Code:
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428 #region Namespace Inclusions using System; using System.Linq; using System.Data; using System.Text; using System.Drawing; using System.IO.Ports; using System.Windows.Forms; using System.ComponentModel; using System.Collections.Generic; using SerialPortTerminal.Properties; using System.Threading; using System.IO; #endregion namespace SerialPortTerminal { #region Public Enumerations public enum DataMode { Text, Hex } public enum LogMsgType { Incoming, Outgoing, Normal, Warning, Error }; #endregion public partial class frmTerminal : Form { #region Local Variables // The main control for communicating through the RS-232 port private SerialPort comport = new SerialPort(); // Various colors for logging info private Color[] LogMsgTypeColor = { Color.Blue, Color.Green, Color.Black, Color.Orange, Color.Red }; // Temp holder for whether a key was pressed private bool KeyHandled = false; private Settings settings = Settings.Default; #endregion #region Constructor public frmTerminal() { // Load user settings settings.Reload(); // Build the form InitializeComponent(); // Restore the users settings InitializeControlValues(); // Enable/disable controls based on the current state EnableControls(); // When data is recieved through the port, call this method comport.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); comport.PinChanged += new SerialPinChangedEventHandler(comport_PinChanged); } void comport_PinChanged(object sender, SerialPinChangedEventArgs e) { // Show the state of the pins UpdatePinState(); } private void UpdatePinState() { this.Invoke(new ThreadStart(() => { // Show the state of the pins chkCD.Checked = comport.CDHolding; chkCTS.Checked = comport.CtsHolding; chkDSR.Checked = comport.DsrHolding; })); } #endregion #region Local Methods /// <summary> Save the user's settings. </summary> private void SaveSettings() { settings.BaudRate = int.Parse(cmbBaudRate.Text); settings.DataBits = int.Parse(cmbDataBits.Text); settings.DataMode = CurrentDataMode; settings.Parity = (Parity)Enum.Parse(typeof(Parity), cmbParity.Text); settings.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cmbStopBits.Text); settings.PortName = cmbPortName.Text; settings.ClearOnOpen = chkClearOnOpen.Checked; settings.ClearWithDTR = chkClearWithDTR.Checked; settings.Save(); } /// <summary> Populate the form's controls with default settings. </summary> private void InitializeControlValues() { cmbParity.Items.Clear(); cmbParity.Items.AddRange(Enum.GetNames(typeof(Parity))); cmbStopBits.Items.Clear(); cmbStopBits.Items.AddRange(Enum.GetNames(typeof(StopBits))); cmbParity.Text = settings.Parity.ToString(); cmbStopBits.Text = settings.StopBits.ToString(); cmbDataBits.Text = settings.DataBits.ToString(); cmbParity.Text = settings.Parity.ToString(); cmbBaudRate.Text = settings.BaudRate.ToString(); CurrentDataMode = settings.DataMode; RefreshComPortList(); chkClearOnOpen.Checked = settings.ClearOnOpen; chkClearWithDTR.Checked = settings.ClearWithDTR; // If it is still avalible, select the last com port used if (cmbPortName.Items.Contains(settings.PortName)) cmbPortName.Text = settings.PortName; else if (cmbPortName.Items.Count > 0) cmbPortName.SelectedIndex = cmbPortName.Items.Count - 1; else { MessageBox.Show(this, "There are no COM Ports detected on this computer.\nPlease install a COM Port and restart this app.", "No COM Ports Installed", MessageBoxButtons.OK, MessageBoxIcon.Error); this.Close(); } } /// <summary> Enable/disable controls based on the app's current state. </summary> private void EnableControls() { // Enable/disable controls based on whether the port is open or not gbPortSettings.Enabled = !comport.IsOpen; txtSendData.Enabled = btnSend.Enabled = comport.IsOpen; //chkDTR.Enabled = chkRTS.Enabled = comport.IsOpen; if (comport.IsOpen) btnOpenPort.Text = "&Close Port"; else btnOpenPort.Text = "&Open Port"; } /// <summary> Send the user's data currently entered in the 'send' box.</summary> private void SendData() { if (CurrentDataMode == DataMode.Text) { // Send the user's text straight out the port comport.Write(txtSendData.Text); // Show in the terminal window the user's text Log(LogMsgType.Outgoing, txtSendData.Text + "\n"); } else { try { // Convert the user's string of hex digits (ex: B4 CA E2) to a byte array byte[] data = HexStringToByteArray(txtSendData.Text); // Send the binary data out the port comport.Write(data, 0, data.Length); // Show the hex digits on in the terminal window Log(LogMsgType.Outgoing, ByteArrayToHexString(data) + "\n"); } catch (FormatException) { // Inform the user if the hex string was not properly formatted Log(LogMsgType.Error, "Not properly formatted hex string: " + txtSendData.Text + "\n"); } } txtSendData.SelectAll(); } /// <summary> Log data to the terminal window. </summary> /// <param name="msgtype"> The type of message to be written. </param> /// <param name="msg"> The string containing the message to be shown. </param> private void Log(LogMsgType msgtype, string msg) { rtfTerminal.Invoke(new EventHandler(delegate { rtfTerminal.SelectedText = string.Empty; rtfTerminal.SelectionFont = new Font(rtfTerminal.SelectionFont, FontStyle.Bold); rtfTerminal.SelectionColor = LogMsgTypeColor[(int)msgtype]; rtfTerminal.AppendText(msg); rtfTerminal.ScrollToCaret(); })); } /// <summary> Convert a string of hex digits (ex: E4 CA B2) to a byte array. </summary> /// <param name="s"> The string containing the hex digits (with or without spaces). </param> /// <returns> Returns an array of bytes. </returns> private byte[] HexStringToByteArray(string s) { s = s.Replace(" ", ""); byte[] buffer = new byte[s.Length / 2]; for (int i = 0; i < s.Length; i += 2) buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16); return buffer; } /// <summary> Converts an array of bytes into a formatted string of hex digits (ex: E4 CA B2)</summary> /// <param name="data"> The array of bytes to be translated into a string of hex digits. </param> /// <returns> Returns a well formatted string of hex digits with spacing. </returns> private string ByteArrayToHexString(byte[] data) { StringBuilder sb = new StringBuilder(data.Length * 3); foreach (byte b in data) sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' ')); return sb.ToString().ToUpper(); } #endregion #region Local Properties private DataMode CurrentDataMode { get { if (rbHex.Checked) return DataMode.Hex; else return DataMode.Text; } set { if (value == DataMode.Text) rbText.Checked = true; else rbHex.Checked = true; } } #endregion #region Event Handlers private void lnkAbout_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { // Show the user the about dialog (new frmAbout()).ShowDialog(this); } private void frmTerminal_Shown(object sender, EventArgs e) { Log(LogMsgType.Normal, String.Format("Application Started at {0}\n", DateTime.Now)); } private void frmTerminal_FormClosing(object sender, FormClosingEventArgs e) { // The form is closing, save the user's preferences SaveSettings(); } private void rbText_CheckedChanged(object sender, EventArgs e) { if (rbText.Checked) CurrentDataMode = DataMode.Text; } private void rbHex_CheckedChanged(object sender, EventArgs e) { if (rbHex.Checked) CurrentDataMode = DataMode.Hex; } private void cmbBaudRate_Validating(object sender, CancelEventArgs e) { int x; e.Cancel = !int.TryParse(cmbBaudRate.Text, out x); } private void cmbDataBits_Validating(object sender, CancelEventArgs e) { int x; e.Cancel = !int.TryParse(cmbDataBits.Text, out x); } private void btnOpenPort_Click(object sender, EventArgs e) { bool error = false; // If the port is open, close it. if (comport.IsOpen) comport.Close(); else { // Set the port's settings comport.BaudRate = int.Parse(cmbBaudRate.Text); comport.DataBits = int.Parse(cmbDataBits.Text); comport.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cmbStopBits.Text); comport.Parity = (Parity)Enum.Parse(typeof(Parity), cmbParity.Text); comport.PortName = cmbPortName.Text; try { // Open the port comport.Open(); } catch (UnauthorizedAccessException) { error = true; } catch (IOException) { error = true; } catch (ArgumentException) { error = true; } if (error) MessageBox.Show(this, "Could not open the COM port. Most likely it is already in use, has been removed, or is unavailable.", "COM Port Unavalible", MessageBoxButtons.OK, MessageBoxIcon.Stop); else { // Show the initial pin states UpdatePinState(); chkDTR.Checked = comport.DtrEnable; chkRTS.Checked = comport.RtsEnable; } } // Change the state of the form's controls EnableControls(); // If the port is open, send focus to the send data box if (comport.IsOpen) { txtSendData.Focus(); if (chkClearOnOpen.Checked) ClearTerminal(); } } private void btnSend_Click(object sender, EventArgs e) { SendData(); } private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) { // If the com port has been closed, do nothing if (!comport.IsOpen) return; // This method will be called when there is data waiting in the port's buffer // Determain which mode (string or binary) the user is in if (CurrentDataMode == DataMode.Text) { // Read all the data waiting in the buffer string data = comport.ReadExisting(); // Display the text to the user in the terminal Log(LogMsgType.Incoming, data); } else { // Obtain the number of bytes waiting in the port's buffer int bytes = comport.BytesToRead; // Create a byte array buffer to hold the incoming data byte[] buffer = new byte[bytes]; // Read the data from the port and store it in our buffer comport.Read(buffer, 0, bytes); // Show the user the incoming data in hex format Log(LogMsgType.Incoming, ByteArrayToHexString(buffer)); } } private void txtSendData_KeyDown(object sender, KeyEventArgs e) { // If the user presses [ENTER], send the data now if (KeyHandled = e.KeyCode == Keys.Enter) { e.Handled = true; SendData(); } } private void txtSendData_KeyPress(object sender, KeyPressEventArgs e) { e.Handled = KeyHandled; } #endregion private void chkDTR_CheckedChanged(object sender, EventArgs e) { comport.DtrEnable = chkDTR.Checked; if (chkDTR.Checked && chkClearWithDTR.Checked) ClearTerminal(); } private void chkRTS_CheckedChanged(object sender, EventArgs e) { comport.RtsEnable = chkRTS.Checked; } private void btnClear_Click(object sender, EventArgs e) { ClearTerminal(); } private void ClearTerminal() { rtfTerminal.Clear(); } private void tmrCheckComPorts_Tick(object sender, EventArgs e) { // checks to see if COM ports have been added or removed // since it is quite common now with USB-to-Serial adapters RefreshComPortList(); } private void RefreshComPortList() { // Determain if the list of com port names has changed since last checked string selected = RefreshComPortList(cmbPortName.Items.Cast<string>(), cmbPortName.SelectedItem as string, comport.IsOpen); // If there was an update, then update the control showing the user the list of port names if (!String.IsNullOrEmpty(selected)) { cmbPortName.Items.Clear(); cmbPortName.Items.AddRange(OrderedPortNames()); cmbPortName.SelectedItem = selected; } } private string[] OrderedPortNames() { // Just a placeholder for a successful parsing of a string to an integer int num; // Order the serial port names in numberic order (if possible) return SerialPort.GetPortNames().OrderBy(a => a.Length > 3 && int.TryParse(a.Substring(3), out num) ? num : 0).ToArray(); } private string RefreshComPortList(IEnumerable<string> PreviousPortNames, string CurrentSelection, bool PortOpen) { // Create a new return report to populate string selected = null; // Retrieve the list of ports currently mounted by the operating system (sorted by name) string[] ports = SerialPort.GetPortNames(); // First determain if there was a change (any additions or removals) bool updated = PreviousPortNames.Except(ports).Count() > 0 || ports.Except(PreviousPortNames).Count() > 0; // If there was a change, then select an appropriate default port if (updated) { // Use the correctly ordered set of port names ports = OrderedPortNames(); // Find newest port if one or more were added string newest = SerialPort.GetPortNames().Except(PreviousPortNames).OrderBy(a => a).LastOrDefault(); // If the port was already open... (see logic notes and reasoning in Notes.txt) if (PortOpen) { if (ports.Contains(CurrentSelection)) selected = CurrentSelection; else if (!String.IsNullOrEmpty(newest)) selected = newest; else selected = ports.LastOrDefault(); } else { if (!String.IsNullOrEmpty(newest)) selected = newest; else if (ports.Contains(CurrentSelection)) selected = CurrentSelection; else selected = ports.LastOrDefault(); } } // If there was a change to the port list, return the recommended default selection return selected; } } }
vérifie que les propriétés Enable de tes objets graphiques sont à true, mais y doit y avoir une logique dans cette appli, genre si non connectée ==> ihm figée... Le mieux serait que tu la simplifies pour ne garder que ce qui te semble nécessaire, et travailler à partir de là...