2017-09-27 6 views
1

J'ai un GPS-Tracker et un lecteur RFID. Je voudrais lire la dernière position GPS après avoir mis ma carte RFID sur le lecteur RFID.C# lire les données de 2 SerialPorts après la tâche

Dans mon code je deviens permanent le GPS-coordinantes. Et j'ai deux SerialPorts "gpsPort" et "rfidPort". Je ne sais pas comment Interrompre deux EventHandler de cette façon. Pouvez-vous résoudre le problème ou une idée?

Voici mon code:

class Program 
{ 
    static void Main(string[] args) 
    { 
     SerialPort gpsPort = new SerialPort("COM5"); 
     gpsPort.BaudRate = 9600; 
     gpsPort.Parity = Parity.None; 
     gpsPort.StopBits = StopBits.One; 
     gpsPort.DataBits = 8; 
     gpsPort.Handshake = Handshake.None; 
     gpsPort.RtsEnable = true; 
     gpsPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); 
     gpsPort.Open(); 

     SerialPort rfidPort = new SerialPort("COM4"); 
     rfidPort.BaudRate = 9600; 
     rfidPort.Parity = Parity.None; 
     rfidPort.StopBits = StopBits.One; 
     rfidPort.DataBits = 8; 
     rfidPort.Handshake = Handshake.None; 
     rfidPort.RtsEnable = true; 
     rfidPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler2); 
     rfidPort.Open(); 
     Console.ReadKey();    
    } 

    public static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) 
    { 

     SerialPort sp = (SerialPort)sender; 

     string indata = sp.ReadExisting(); 

     if (indata.Contains("GPRMC")) 
     { 
      string[] sentence = indata.Split(','); 

      string latitude = sentence[3].Substring(0, 2) + "°"; 
      latitude = latitude + sentence[3].Substring(2); 
      latitude = latitude + sentence[4]; 

      string longitude = sentence[5].Substring(2, 1) + "°"; 
      longitude = longitude + sentence[5].Substring(3); 
      longitude = longitude + sentence[6]; 

      Console.Write("Latitude:" + latitude + Environment.NewLine + "Longitude:" + longitude + Environment.NewLine + Environment.NewLine); 
     }    
    } 

    public static void DataReceivedHandler2(object sender, SerialDataReceivedEventArgs e) 
    { 
     SerialPort sp = (SerialPort)sender; 
     string indata = sp.ReadExisting(); 

     Console.Write(indata + Environment.NewLine);  
    } 
} 

Répondre

0

Faire string indata une variable statique en dehors de la portée des sapins événement DataReceived.

class Program 
{ 
    private static string indata_GPS = ""; 
.... 
} 

maintenant, vous devriez lire GPS dans cette variable:

public static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) 
{ 
    SerialPort sp = (SerialPort)sender; 
    indata_GPS = sp.ReadExisting(); 

dès la deuxième DataReceived événement se déclenche à partir du dispositif RFID vous suffit de lire la valeur de indata_GPS. De cette façon, vous aurez la dernière valeur du GPS

public static void DataReceivedHandler2(object sender, SerialDataReceivedEventArgs e) 
{ 
    SerialPort sp = (SerialPort)sender; 
    string indata = sp.ReadExisting(); 

    Console.Write("RFID: " + indata + Environment.NewLine); 
    Console.Write("GPS latest Data: " + indata_GPS + Environment.NewLine); 
} 

Je ne sais pas comment deux Interrompre EventHandler

Pas besoin d'interrompre quoi que ce soit;)

+0

Merci ça marche! Mais je reçois à chaque fois 2 Tags des dernières données GPS dans la console. Avez-vous maintenant pourquoi? –

+0

@ hx_9009 que je ne connais pas vraiment. Je ne sais pas exactement à quoi ressemble votre code. Avez-vous le 'Console.Write' dans les deux événements' DataReceived'? –

+0

pas eu un seul Console.Write dans DataReceivedHandler2. Quand je commence l'application au début je reçois seulement une étiquette. Mais après que je reçois toujours deux tags –