bonjour a tous ,
j'effectue un interface qui est sensée retracer le périmètre d'un champ grâce au coordonnée gps.
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
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading;
 
 
namespace WindowsFormsApplication11
{
    public partial class Form1 : Form
    {
        /*
         besoin d'un thread pour appeler la richtextbox pour le portserie 
         car on ne peut pas acceder a partir du thread du portsrie 
         */
        Thread rtb;// creation du thread
        delegate void T();// creation du delegué
        T recup;// creation d'un delegue s'appelant recup
 
        // creation d'un tableau de points , d'une liste de point , et d'un point
        // le pointf est un point contenant une coordonnées 
        PointF pt=new PointF();// le point (coordonnées X et Y)
        List<PointF> mespoints=new List<PointF>();// la list de point 
        PointF[] tabpts;// tableau de points
 
        PointF coordonnees = new PointF();
        List<PointF> geodata = new List<PointF>();
        PointF[] coordon;
 
        // todo variable 
 
 
        // creation de variable pour les points entrés
        float nombrex, nombrey;
        int verbtnaff = 0;
        int degrelat,degrelong;
        decimal minutelat,minutelong,convlat,convlong,radlat, radlong;
 
 
        // declaration d'una variable pour le choix du port série à utiliser
        string choixport, choicecolor; 
        // declaration du pen 
        Pen greenpen = new Pen(Color.Green, 2); //definition d'un nouveau bic ,et de sa couleur , de la grosseur du trait
 
 
        public Form1()
        {
            InitializeComponent();
            recup= new T(recuperation);// méthode des délégués 
        }
 
        public void main()
        {}
 
        private void btnbalisage_Click(object sender, EventArgs e)
        {//attention par securité il faudra stopper les actions des boutons
            //affichage du btnretour menu 
            btnretour.Visible = true;
            //pour se reperer dans quelle partie du programme nous sommes 
            lblbalisage.Visible = true;
            lblchampsenregistre.Visible = false;
            lblparametres.Visible = false;
            // pour le demarrage du balisage 
            btndembal.Visible = true;
 
            richTextBox1.Visible = true;
            lblchoixport.Visible = true;
            cbxchoixport.Visible = true;
            btntestconex.Visible = true;
            btnenre.Visible = true;
            // action secondaire qui apparaitront lors de l'appui sur paramètre.
            btncolor.Visible = false;
            // action secondaire devront apparaître lors de l'appui sur champs enregistré
            btnouvrir.Visible = false;
            // fermeture du port série
            portserie.Close();
        }
 
        private void btnchampsenre_Click(object sender, EventArgs e)
        {//attention par securité il faudra stopper les actions des boutons
            //affichage du btnretour menu 
            btnretour.Visible = true;
            //pour se reperer dans quelle partie du programme nous sommes 
            lblbalisage.Visible = false;
            lblchampsenregistre.Visible = true;
            lblparametres.Visible = false;
            //supprimer les actions possibles des autres parties du programme 
            // supression du sousprogramme du bouton balisage
            btndembal.Visible = false;
            lblchoixport.Visible = false;
            cbxchoixport.Visible = false;
            btntestconex.Visible = false;
 
            richTextBox1.Visible = true;
            btnenre.Visible = false;
            // action secondaire qui apparaitront lors de l'appui sur paramètre.
            btncolor.Visible = false;
            // action secondaire devront apparaître lors de l'appui sur champs enregistré
            btnouvrir.Visible = true;
            // effecement de la picturebox 
            pictureBox1.Dispose();
            // rafraichir la richtextbox
            richTextBox1.Clear();
            // fermeture du port série
            portserie.Close();
        }
 
        private void btnparametres_Click(object sender, EventArgs e)
        {//attention par securité il faudra stopper les actions des boutons
            //affichage du btnretour menu 
            btnretour.Visible = true;
            //pour se reperer dans quelle partie du programme nous sommes
            lblbalisage.Visible = false;
            lblchampsenregistre.Visible = false;
            lblparametres.Visible = true;
            //supprimer les actions possibles des autres parties du programme 
            // supression du sousprogramme du bouton balisage
            btndembal.Visible = false;
            lblchoixport.Visible = false;
            cbxchoixport.Visible = false;
            btntestconex.Visible = false;
            richTextBox1.Visible = true;
            btnenre.Visible = false;
            btncolor.Visible = true;
            // action secondaire devront apparaître lors de l'appui sur champs enregistré
            btnouvrir.Visible = false;
        }
 
        private void btndembal_Click(object sender, EventArgs e)
        { // todo demarrer balisage
            //permet de creer le pen affin d'afficher 
            Graphics g = Graphics.FromHwnd(pictureBox1.Handle);   //encapsulage d'une surface de dessin , mise en lien
            //avec la picturebox
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; //ligne de commande pour lisser la ligne
            //graphique tracée  
            greenpen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid;      // ligne pour commander l'apparence de la ligne
            // permet de convertir la list de points en tableau de point grâce au pen appelé greenpen
 
            g.DrawLines(greenpen, tabpts);    // la methode drawlines dessine un segment d'un tableau
        //pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;// pour une image 
            g.Dispose();                      // pour ne pas occuper de la memoire pour rien.
 
        }
 
 
 
        private void Form1_Load(object sender, EventArgs e)
        {
            retourload();//appel de la fonction retourload
        }
 
        private void btnretour_Click(object sender, EventArgs e)
        {
            retourload();// appel de la fonction retourload
        }
 
        void retourload() // création de la fonction qui retourne au menu principale 
        {
            // possibilité du menu principale 
            btnbalisage.Visible = true;
            btnparametres.Visible = true;
            btnchampsenre.Visible = true;
            // les trois label doivent etre visible pour afficher les choix possibles
            lblbalisage.Visible = true;
            lblchampsenregistre.Visible = true;
            lblparametres.Visible = true;
            //action secondaires qui apparaîtront lors de l'action sur les boutons du menu principale
            btndembal.Visible = false;
            lblchoixport.Visible = false;
            cbxchoixport.Visible = false;
            btntestconex.Visible = false;
 
            richTextBox1.Visible = false;
            btnenre.Visible = false;
            btnretour.Visible = false;
            // action secondaire qui apparaitront lors de l'appui sur paramètre.
            btncolor.Visible = false;
            // action secondaire devront apparaître lors de l'appui sur champs enregistré
            btnouvrir.Visible = false;
            //initialisation du premier point pour la picture box 
        }
        //todo richtextbox
        //private void txtbY_KeyDown(object sender, KeyEventArgs e)
        //{
        //    if (e.KeyCode == Keys.Enter) 
        //    {
 
        //        verbtnaff = verbtnaff + 1;// verifi btn afficher
        //        nombrex = Convert.ToSingle(txtbX.Text);
        //        nombrey = Convert.ToSingle(txtbY.Text);
 
        //        pointrich.X = nombrex;// seront les point affiché dans la richtextbox
        //        pointrich.Y = nombrey;
 
        //        richTextBox1.Text = richTextBox1.Text + pointrich + "\r"; // tout depend de la syntaxe pour la récuperation.
 
        //        // on r centre le point 
        //        pt.X = (pictureBox1.Width / 2) + nombrex; // permet de mettre en relation la textbox1 avec la coordonnée x du point pt
        //        pt.Y = (pictureBox1.Height / 2) - nombrey;// permet de mettre en relation la textbox2 avec la coordonnée y du point pt
 
        //        mespoints.Add(pt);// permet d'ajouter un point a la liste de point dont le point est appelé 
        //        // pt et dont les coordonnée sont (x,y)
        //        tabpts =  mespoints.ToArray();     // converti la liste de point en tableau de points  
        //    }
        //}
        private void cbxchoixport_SelectedIndexChanged(object sender, EventArgs e)
        {/* bouton pour choisir le choix du port utilisé  pour cela , 
            il suffit d'utiliser la propriété selecteditem du combobox "cbxchoixport"
            et de donner le nom au port serie grace au elements modifié préalablement.
          */
            portserie.Close();
            choixport = cbxchoixport.SelectedItem.ToString();
            portserie.PortName = choixport;
        }
        //desactivation de l'evenement sur le port série a dmd 
        private void btntestconex_Click(object sender, EventArgs e)
        {
            /* besoin de la methode try catch :
             * si le port serie a un probleme lors du test de la connexion, c'est qu'il n'existe pas 
             */
            try
            {
                portserie.Open();
                portserie.DtrEnable = true;
                if (portserie.DsrHolding == true)
                {
                    label1.Text = "ok";
                }
            }
            catch (Exception)
            {
                label1.Text = "pas de connexion";
            }
            }           
        private void btncolor_Click(object sender, EventArgs e)
        {// permet de changer la couleur du pen.
            colorDialog1.ShowDialog();
            choicecolor = colorDialog1.Color.ToString();
            greenpen.Color = colorDialog1.Color;
            //permet de creer le pen affin d'afficher 
            Graphics g = Graphics.FromHwnd(pictureBox1.Handle);   //encapsulage d'une surface de dessin , mise en lien
            //avec la picturebox
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; //ligne de commande pour lisser la ligne
            //graphique tracée  
            greenpen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid;      // ligne pour commander l'apparence de la ligne
            // permet de convertir la list de points en tableau de point grâce au pen appelé greenpen
            g.DrawLines(greenpen, tabpts);    // la methode drawlines dessine un segment d'un tableau
            g.Dispose();                      // pour ne pas occuper de la memoire pour rien.
 
        }
        private void btnenre_Click(object sender, EventArgs e)
        {//todo enregistrement 
            saveFileDialog1.ShowDialog();// faire apparaître la savefiledialog
            // permet de retranscrire le txt dans un fichier.text 
            saveFileDialog1.DefaultExt = ".txt";
            richTextBox1.SaveFile(saveFileDialog1.FileName, RichTextBoxStreamType.PlainText);
        }
        private void btnouvrir_Click(object sender, EventArgs e)
        {
            OpenFileDialog dialog = new OpenFileDialog();// declaration d'une variable qui fait référence à un openfiledialog
            dialog.Filter = "Fichiers texte|*.txt";//definition de l'extention du fichier
            if (dialog.ShowDialog() == DialogResult.OK)// si l'on a appuyé sur ok de la fenetre openfiledialog
            {
                richTextBox1.Text = File.ReadAllText(dialog.FileName);
                // on lit le fichier dans la richtextbox
 
                // ou encore :
                // richTextBox1.LoadFile(dialog.FileName);
            }
        }
        /* a ne pas mettre dans un private void si non les fonction n porte pas 
        sur l'ensemble des fonction privée (fonction dite inaccessible)
        */
 
        void recuperation()//delegue
        {          
            // besoin de spliter 
            /* pour connaitre la distance entre deux point nous allons devoir calculer a formule du grand cercle qui elle demande au préalable de 
               d'avoir les angle sous la forme de seconde */
            string[] donnees = data.Split(',');  // 
            richTextBox1.Text = richTextBox1.Text + donnees[3] + " " + donnees[5] + "\n";
            ///// la conversion fonctionne /////////
            // conversion de la latitude 
            degrelat = Convert.ToInt32(donnees[3].Remove(2,7));
            minutelat = Convert.ToDecimal(donnees[3].Remove(0,2).Replace(".",","));
            // conversion de la longitude 
            degrelong = Convert.ToInt32(donnees[5].Remove(3,7));
            minutelong = Convert.ToDecimal(donnees[5].Remove(0,3).Replace(".",","));
 
 
            // conversion en seconde//
            convlat = ((degrelat) * 3600) + (minutelat*60); // lattitude en seconde
            convlong = ((degrelong * 3600)) + (minutelong * 60);// longitude en seconde 
            label3.Text = convlat.ToString();
            label4.Text = convlong.ToString();
            // conversion en radian 
 
 
            ////todo recup        // calcul de distance 
            //radlat = ((3,14559 * convlat) / 648000);
            //radlong = ((3,14159 * convlong) / 648000);
            //label1.Text = radlat.ToString();
            //label2.Text = radlong.ToString();
            }
 
 
 
        string data;
        public void portserie_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            data = portserie.ReadLine();
            // lecture du portserie et mise dans la
            // variable de type string "data"
            // demarrage du thread 
            if (data.IndexOf("$GPRMC") == 0)
            {
 
                // lecture du portserie et mise dans la
                // variable de type string "data"
                // demarrage du thread 
                rtb = new Thread(new ThreadStart(threadA));
                rtb.IsBackground = true;//executé en arriere plan 
                rtb.Start();
            }
 
        }
            void threadA()// thread
        { 
 
            Invoke(recup);
        }
            private void richTextBox1_TextChanged(object sender, EventArgs e)
            {
            }
 
 
 
            private void button2_Click(object sender, EventArgs e)
            {
                portserie.Close();
 
            }
 
 
        }
    }
mon problème se situe au niveau du l'invoke , il arrive temps en temps a ce que j'ai se message :
l'index et le compte doivent faire références à un emplacement situé dans la chaine.
nom du paramètre count.
la trame que je reçois sur le RS232 est la trame NMEA 0183. ce dont j'ai besoin ce sont les coordonnées ( latutude et longitude) qui se situe au niveau du 3 ieme et 5 ieme argument de la phrase GPRMC.
je ne comprends pas quelle est mon problème car je reçois la trame sour la forme :
longitude : DDDMM,mmmm
lattitude : DDMM,mmmm