Bonjour,
Je dialogue avec une carte Electronique en Ethernet. J'envoi une commande ST (de statut), mais je dois cliquer plusieurs fois sur envoyer pour recevoir l'intégralité de ma trame.
J'ai donc fait ce petit test: attendre que je reçoive ! ou ? pour return le message reçu...
Sauf que cela fait une boucle infinie... ce caractère "!" correspond à une commande comprise par le panneau (Ack), à l'inverse Nack, cependant quand j'envoi une commande il ce peu que je reçoive "!" dans un premier Click ou un début de réponse STAT mais pas tout, il faut que je reclick pour avoir l'intégralité de la réponse de l'UC!
Voici le code:
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 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Diagnostics; using System.IO; using System.Net.Sockets; using System.Net; namespace Liaison_IP { public partial class Form1 : Form { System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient(); public Form1() { InitializeComponent(); } private void BP_Connect_Click(object sender, EventArgs e) { try { clientSocket.Connect("X.X.X.X", 2101); lb_Etatduport.Text="Port ouvert"; } catch { MessageBox.Show("erreur de connexion", "erreur"); } } public void BP_Envoyer_Click(object sender, EventArgs e) { NetworkStream serveurStream = clientSocket.GetStream(); byte[] outStream = System.Text.Encoding.ASCII.GetBytes(TB_MessageEnvoye.Text+'\r'); try { serveurStream.Write(outStream, 0, outStream.Length); serveurStream.Flush(); byte[] inStream = new byte[clientSocket.ReceiveBufferSize]; int nbrlu=serveurStream.Read(inStream, 0, clientSocket.ReceiveBufferSize); string returndata = System.Text.Encoding.ASCII.GetString(inStream, 0, nbrlu); foreach (byte b in inStream) { if (b.ToString().Equals("!") || b.ToString().Equals("?")) { messagerecu(returndata); TB_MessageEnvoye.Text = ""; TB_MessageEnvoye.Focus(); } } } catch { MessageBox.Show("erreur d'envoi", "erreur"); } } public void messagerecu(string msg) { TB_MessageReçu.Text=TB_MessageReçu.Text + msg; } private void Initializetimertestpicto() { timertestpicto.Enabled=true; timertestpicto.Interval=60000; } } }Quand je compile avec ce code:
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 public void BP_Envoyer_Click(object sender, EventArgs e) { NetworkStream serveurStream = clientSocket.GetStream(); byte[] outStream = System.Text.Encoding.ASCII.GetBytes(TB_MessageEnvoye.Text+'\r'); try { serveurStream.Write(outStream, 0, outStream.Length); serveurStream.Flush(); byte[] inStream = new byte[clientSocket.ReceiveBufferSize]; int nbrlu=serveurStream.Read(inStream, 0, clientSocket.ReceiveBufferSize); string returndata = System.Text.Encoding.ASCII.GetString(inStream, 0, nbrlu); /*foreach (byte b in inStream) { if (b.ToString().Equals("!") || b.ToString().Equals("?")) { messagerecu(returndata); TB_MessageEnvoye.Text = ""; TB_MessageEnvoye.Focus(); } }*/ messagerecu(returndata); TB_MessageEnvoye.Text = ""; TB_MessageEnvoye.Focus(); }
J'envoi par un click: ST et je reçois: STAT il faut que je reclick sur le bouton envoyer pour avoir: STATUS ADR=010 BTR=0 CKS=0FAD COD=I0106.0 CTL=0 EDF=0 ER0=00 ER1=00 ER2=00 ERI=I0052/4.0.15/0 EVT=ERI:20/03/15 09:08:16 GAR=000 GAT=0 GEN=LAX.PA1 INI=015 LOC=CARROS MOV=0 NST=2004 RST=023 TRM=0 VER=001!
Merci, amis experts csharp de m'aiguiller sur le sujet!
Cordialement,
Partager