繁体   English   中英

设置超时以检查数据是从C#中的串行端口接收的

[英]Setting timeout to check data is received from serial port in c#

我正在从连接到PC的GPS设备接收纬度和经度值。 我需要将timeinterval设置为500毫秒后,如果我没有从端口接收数据,则需要打印一些文本。 我不知道该怎么做,有人可以帮我解决这个问题。 我还上传了我的代码。

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);
    }
 }
}

您可以使用同步对象(例如ManualResetEvent来检查是否在500毫秒内收到了数据。

宣布:

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
    }

    ...

}

制作另一个类来处理传入的数据

在该类中,启动计时器,当传入数据是完整的gps消息时,停止计时器。

您可以根据启动的触发条件使用公共方法启动计时器,因此

_gps.Start()

然后在您的序列号中

_gps.Interpret(indata)

顺便说一句,让课程更长的时间。 制作一类用于将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()
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM