[英]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.