[C#] Meerdere Compoorten uitlezen/verwerken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Isengrim
  • Registratie: Februari 2004
  • Laatst online: 19:13
Goedenavond

Ik probeer 3 verschillende compoorten uit te lezen. Dat gaat prima, alleen moet de data (verschillende metingen) in een meting opgeslagen worden en daar zit het probleem.
Ik roep nu voor iedere aparaat de DataReceived event handler aan die roept vervolgens een methode aan waarin de data uitgelezen wordt
Alleen moet de data van de 3 verschillende apparaten in een object komen die ik vervolgens op kan slaan, alleen kom ik er niet uit hoe dat zou moeten.

Iemand enig idee?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Isengrim schreef op dinsdag 14 december 2010 @ 22:08:
Alleen moet de data van de 3 verschillende apparaten in een object komen die ik vervolgens op kan slaan, alleen kom ik er niet uit hoe dat zou moeten.
C#:
1
2
3
4
5
class ThreeDeviceDataContainer {
  public DeviceData MyData_One { get; set; }
  public DeviceData MyData_Zwei { get; set; }
  public DeviceData MyData_III { get; set; }
}


Seriously though; wat heb je al geprobeerd, gezocht, gevonden? Ik vind 't frappant dat je wel serieele poorten kunt uitlezen maar niet zou snappen hoe je data van drie devices in een object zou moeten mikken. Tenzij je aan 't copy/paste "programmeren" bent.

[ Voor 60% gewijzigd door RobIII op 14-12-2010 22:24 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Isengrim
  • Registratie: Februari 2004
  • Laatst online: 19:13
Misschien is een voorbeeldje wat handiger:

De apparaten:


C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
            List<NMEADevice> devices = new List<NMEADevice>();

            devices.Add(new NMEADevice("GPS", "COM4"));
            devices.Add(new NMEADevice("Windmeter", "COM5"));
            devices.Add(new NMEADevice("Inclinometer", "COM6"));


            foreach (NMEADevice d in devices)
            {
                Console.WriteLine(d.Name);

                d.Device().DataReceived += new NMEADeviceLineParser().DataHandler;

                

            }


De parser:

C#:
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
        public void DataHandler(object sender, SerialDataReceivedEventArgs e)
        {
            device = (SerialPort)sender;
           

            string line = device.ReadLine();
            string[] lineItems = line.Split(',');
           
            if (measurement == null)
                measurement = new Measurement();

            measurement.MeasurementSessionID = 1;


            if (lineItems.FirstOrDefault().StartsWith("$WIMWV")) //Windmeter
            {

                //Console.WriteLine("Windmeting");
                //Console.WriteLine(line);

                try
                {
                    measurement.WindmeterAngle = Double.Parse(lineItems[1]);
                    measurement.WindmeterSpeed = Double.Parse(lineItems[2]);
                }
                catch (FormatException ex)
                {
                    measurement.WindmeterAngle = 0.0;
                    measurement.WindmeterSpeed = 0.0;
                }


                r.SaveMeasurement(measurement);
            }

            if (lineItems.Contains("$HCHPR")) //Inclinometer
            {
                try
                {
                    measurement.InclinometerHeading = Double.Parse(lineItems[1]);
                    measurement.InclinometerPitch = Double.Parse(lineItems[2]);
                    measurement.InclinometerRoll = Double.Parse(lineItems[3]);
                }

                catch (FormatException ex)
                {
                    measurement.InclinometerHeading = 0.0;
                    measurement.InclinometerPitch = 0.0;
                    measurement.InclinometerRoll = 0.0;
                }

                r.SaveMeasurement(measurement);
            }


            if (lineItems.Contains("$GPRMC")) // GPS
            {

                string latitude = " ";
                string longitude = " ";
                latitude = lineItems[3] + lineItems[4];
                longitude = lineItems[5] + lineItems[6];

                if (latitude == null || longitude == null)
                {
                    latitude = " ";
                    longitude = " ";
                }

                measurement.GpsLatitude = latitude;
                measurement.GpsLongitude = longitude;

                try
                {

                    measurement.GpsSpeed = Double.Parse(lineItems[7]);
                    measurement.GpsTrackAngle = Double.Parse(lineItems[8]);
                }
                catch (FormatException ex)
                {
                    measurement.GpsSpeed = 0.0;
                    measurement.GpsTrackAngle = 0.0;
                }

                r.SaveMeasurement(measurement);
                
            }

            r.SaveMeasurement(measurement);
           
        }


Nou is het zo dat de measurement opgeslagen moet worden als alle data compleet is, en daar gaat het mis

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Isengrim schreef op dinsdag 14 december 2010 @ 22:31:
Nou is het zo dat de measurement opgeslagen moet worden als alle data compleet is, en daar gaat het mis
Definieer "gaat mis". Help ons jou te helpen: wees specifiek, beperk je tot relevante(!) stukken code en vermeld foutmeldingen en omschrijf je probleem duidelijk.

Anyhoe, ik zie niet hoe die DataHandler() method relevant is om hier te posten en ik zie niet waarom je niet in het Datareceived event de data van de drie devices opslaat in een array/list/dictionary/POCO/who_cares. Kwestie van de sender af-flaggen en als ze alle 3 hun data hebben ontvangen raise je een DataComplete event of roep je een andere method aan of weetikhet/younameit.

[ Voor 32% gewijzigd door RobIII op 14-12-2010 22:40 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Isengrim
  • Registratie: Februari 2004
  • Laatst online: 19:13
Ik krijg alleen maar losse data, dus of alleen de windmeter, of alleen de inclinometer of alleen de gps gegevens. in de measurement

Ik denk dat het komt omdat ik 3x een nieuwe instantie van de parser aanmaak.

Ik wil de gegevens van de 3 apparaten uitlezen en als alle data compleet is dan moet het opgeslagen worden. Ik zie alleen niet waar ik moet beginnen

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Isengrim schreef op dinsdag 14 december 2010 @ 22:41:
Ik krijg alleen maar losse data, dus of alleen de windmeter, of alleen de inclinometer of alleen de gps gegevens. in de measurement
Daar is de sender parameter toch voor :? (Los van 't feit dat in de data zelf klaarblijkelijk ook nog eens staat welke meter zich meldt; gezien je lineItems.contains(...) constructie).
Isengrim schreef op dinsdag 14 december 2010 @ 22:41:
Ik denk dat het komt omdat ik 3x een nieuwe instantie van de parser aanmaak.
Dus :? Elke instantie ontvangt z'n eigen data. Dan kun je toch van elke instantie afvinken of je data hebt ontvangen?
Isengrim schreef op dinsdag 14 december 2010 @ 22:41:
Ik wil de gegevens van de 3 apparaten uitlezen en als alle data compleet is dan moet het opgeslagen worden. Ik zie alleen niet waar ik moet beginnen
Je houdt 3 referenties vast naar de parsers; je laat elke parser een "DataComplete" event raisen en ze alle 3 dat event geraised hebben is je data compleet :?

[ Voor 14% gewijzigd door RobIII op 14-12-2010 22:57 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Dars123
  • Registratie: Juni 2008
  • Laatst online: 23-11-2022
Wat gebeurt er als er 3 keer data van de GPS-meter binnenkomt, en 2 keer van de windmeter en 1 keer van de Inclinometer? Dan slaat measurement alleen de laatste metingen op van GPS en van wind, maar corresponderen die wel met die ene meting van de Inclinometer?

Zou je de metingen niet moeten vangen binnen een tijdspanne om er zeker te zijn van een correcte meting, aangezien je alleen data van alle meters tezamen als een geslaagde measurement ziet?

Verder zou je kunnen overwegen Double.TryParse() gebruiken i.p.v. van try..catch i.c.m. Double.Parse() te gebruiken.

Acties:
  • 0 Henk 'm!

Verwijderd

Probeer dit eens:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
List<NMEADevice> devices = new List<NMEADevice>(); 

            devices.Add(new NMEADevice("GPS", "COM4")); 
            devices.Add(new NMEADevice("Windmeter", "COM5")); 
            devices.Add(new NMEADevice("Inclinometer", "COM6")); 

NMEADeviceLineParser parser = new NMEADeviceLineParser();
            foreach (NMEADevice d in devices) 
            { 
                Console.WriteLine(d.Name); 

                d.Device().DataReceived += parser.DataHandler; 
            } 


Je instantieerde steeds een nieuwe class van de NMEADeviceLineParser en in die class probeerde je de data op te slaan. Hierdoor werd dus per device de data in een aparte class opgeslagen. Nu zou dat in 1 class moeten gebeuren.

Acties:
  • 0 Henk 'm!

  • ThaStealth
  • Registratie: Oktober 2004
  • Laatst online: 11-09 10:19
Ik weet niet hoe je meet interval is, maar wij werken hier met positie + voltageveranderingen. De meetintervallen zijn voor beide verschillend. Om te bepalen wat een voltage was opeen positie slaan wij beide los op met de datum/tijd van meting.

Naderhand koppelen we deze gegevens door ofwel de dichtstbijzijnde positie te zoeken bij een voltage, of door te interpoleren op het voltage.

De methode wat je nu gebruikt zorgt ervoor dat als 1 van de 3 een event genereert je alle 3 opslaat (wellicht met 1 of 2 onbekende waardes dus)

Mess with the best, die like the rest

Pagina: 1