2017-06-09 2 views
0

私のPCに接続されたGPSデバイスから緯度と経度の値を受信して​​います。私はtimeinterval を設定して、ポートからデータを受け取らない場合は500ミリ秒後にテキストを印刷する必要があります。私は知らない これを行う方法誰かがこの問題を解決する方法を助けてくださいできることができます。私は自分のコードをアップロードしました。シリアルポートからデータをチェックする設定タイムアウトをC#

class PortDataReceived 
{ 
private static SerialPort mySerialPort; 

public static void Main() 
{ 

    mySerialPort = new SerialPort("COM5"); 
    mySerialPort.BaudRate = 9600; 
    mySerialPort.Parity = Parity.None; 
    mySerialPort.StopBits = StopBits.One; 
    mySerialPort.DataBits = 8; 
    mySerialPort.Handshake = Handshake.None; 
    mySerialPort.RtsEnable = true; 

    //mySerialPort.ReadTimeout = 500; 


    mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); 


    mySerialPort.Open(); 


    Console.WriteLine(); 
    Console.ReadKey(); 
    mySerialPort.Close(); 

} 

private static void DataReceivedHandler(
        object sender, 
        SerialDataReceivedEventArgs e) 
{ 
    SerialPort sp = (SerialPort)sender; 
    string indata = sp.ReadExisting(); 
    //////////////////////////////////// 
    //System.Threading.Thread.Sleep(1000); 
    //Console.WriteLine("NAN"); 
    /* Timer tmr = new System.Timers.Timer(); 
    tmr.Interval = 500; 
    tmr.Elapsed += OnTimedEvent; 
    tmr.AutoReset = true; 
    // Start the timer 
    tmr.Enabled = true 

    private static void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e) 
    { 
     if(indata == null) 
    * { 
    *  Console.WriteLine("NAN"); 
    * } 
    }*/ 



    //////////////////////////////////// 



    { 

     string pattern = @"^\$GNGGA,[^,]+,(\d{2})(\d{2}\.\d+),([NS]),(\d{3})(\d{2}\.\d+),([EW]),.+$"; 
     System.Text.RegularExpressions.MatchCollection matches = System.Text.RegularExpressions.Regex.Matches(indata, pattern); 
     if (matches.Count > 0) 
     { 
      foreach (System.Text.RegularExpressions.Match match in matches) 
      { 
       double Lat = Double.Parse(match.Groups[1].Value, System.Globalization.CultureInfo.InvariantCulture); 
       Lat += Double.Parse(match.Groups[2].Value, System.Globalization.CultureInfo.InvariantCulture)/60; 
       Lat *= match.Groups[3].Value == "N" ? 1 : -1; 
       double Lng = Double.Parse(match.Groups[4].Value, System.Globalization.CultureInfo.InvariantCulture); 
       Lng += Double.Parse(match.Groups[5].Value, System.Globalization.CultureInfo.InvariantCulture)/60; 
       Lng *= match.Groups[6].Value == "E" ? 1 : -1; 
       string output = "{Lat: " + Lat.ToString(System.Globalization.CultureInfo.InvariantCulture); 
       output += ", Lng: " + Lng.ToString(System.Globalization.CultureInfo.InvariantCulture) + "}"; 
       Console.WriteLine(output); 

      } 
     } 

     //mySerialPort.DataReceived -= new SerialDataReceivedEventHandler(DataReceivedHandler); 
    } 
} 
} 

答えて

0

あなたは、データが500ミリ秒以内に受信されているかどうかをチェックするManualResetEvent例えば、同期オブジェクトを使用することができます。

宣言:

class PortDataReceived 
{ 
    // Create an event which is not signaled 
    ManualResetEvent DataReceivedEvent = new ManualResetEvent(false); 

    ... 

} 

private static void DataReceivedHandler(
       object sender, 
       SerialDataReceivedEventArgs e) 
{ 
    // Set the event object to signaled state as soon as data is received 
    DataReceivedEvent.Set(); 

    ... 

} 

が次にあなたが行うことができますMain機能に:

public static void Main() 
{ 

    ... 

    mySerialPort.Open(); 

    TimeSpan waitTime = TimeSpan.FromMilliseconds(500); 

    if(DataReceivedEvent.WaitOne(waitTime) == false) 
    { 
     // Failure: Data has not been received within waitTime 
     // Print text 
    } 
    else 
    { 
     // Success: Data has been received within waitTime 
     // Do work 
    } 

    ... 

} 
0

タイマーを停止し、そのクラスに入ってくるデータに

を処理するための別のクラスは、タイマーを開始してください着信データが完全なgpsメッセージである場合。

あなたはタイマーを開始するパブリックメソッドを作ることができますトリガがスタート何のためにあるのかによって、その

_gps.Start()

、あなたのシリアルに同じよう

_gps.Interpret(indata) 

を呼び出しますasside、latを長くするクラスを作る。そう解釈

をcooridinatesするためにあなたのGPSの文字列を変換するためのクラスが

public void Interpret(string s) 
{ 
    var extra = _packet.Consume(s); // extra is if s has more than the data you are expecting 
    if(_packet.Complete) 
    { 
     var location = packet.ToLocation() 
    } 
} 
ようになります作ります
関連する問題