[英]How to read GPS data via serial-port in C#?
我想使用C#中的GPS通过串行端口获取GPS数据。 我制作了ParseNMEA类来获取NMEA数据,对其进行解析并获得$ GPGAA。 这是班。
public class ParseNMEA
{
private SerialPort _port;
private byte[] _buffer;
public string GetGpgga(string portname, int baudrate, Parity parity, int databits, StopBits stopbits)
{
//Set serial-port
_port = new SerialPort();
_port.PortName = portname;
_port.BaudRate = baudrate;
_port.Parity = parity;
_port.DataBits = databits;
_port.StopBits = stopbits;
_port.DataReceived += new SerialDataReceivedEventHandler(SerialPort_DataReceived);
_port.Open();
//Parse buffer
string sdata = "";
Encoding encoding = ASCIIEncoding.GetEncoding(1252);
if (null != _buffer)
{
sdata = encoding.GetString(_buffer);
}
string[] string_array = sdata.Split('$');
string Gpgga = null;
for (int i = 0; i < string_array.Length; i++)
{
string stringTemp = string_array[i];
string[] line_array = stringTemp.Split(',');
if (line_array[0] == "GPGGA")
{
Gpgga = string.Join(",", string_array[i]);
}
}
return Gpgga;
}
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort port = (SerialPort)sender;
_buffer = new byte[port.BytesToRead];
port.Read(_buffer, 0, _buffer.Length);
}
}
我想在Form中调用此类。 像这样:
private ParseNMEA _parse;
_parse = new ParseNMEA();
private void button_start_click(object sender, EventArgs e)
{
string gpgga = _parse.GetGpgga(comport, baudrate, parity, databits, stopbits);
textBox1.Text = gpgga;
}
但这是行不通的。 我认为SerialPort_DataReceived事件有任何问题。 如果您有任何想法。 请帮我。
谢谢。
是从设备以字符串还是字节形式传输数据? 您正在读取数据,就好像它是以字节为单位输入的一样,但是随后将其转换为字符串值。 如果以字符串形式出现,则只需使用port.ReadLine()方法,但请确保将port.NewLine属性设置为与设备传输的任何换行符或字符系列相对应。 或者,您可以使用port.ReadTo()方法并指定要查找的字符串。 您是否有任何数据? 如果没有找到您的设备需要哪种类型的握手,则将port.Handshake属性设置为匹配。
在GetGpgga()
您似乎没有等待接收数据的时间-我希望有更多类似的内容(未经测试):
public class ParseNMEA
{
private SerialPort _port;
private byte[] _buffer;
public ParseNMEA()
{
//Set serial-port
_port = new SerialPort();
_port.PortName = portname;
_port.BaudRate = baudrate;
_port.Parity = parity;
_port.DataBits = databits;
_port.StopBits = stopbits;
_port.DataReceived += new SerialDataReceivedEventHandler(SerialPort_DataReceived);
_port.Open();
}
public string LastGpgga { get; set; }
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort port = (SerialPort)sender;
_buffer = new byte[port.BytesToRead];
port.Read(_buffer, 0, _buffer.Length);
//Parse buffer
string sdata = "";
Encoding encoding = ASCIIEncoding.GetEncoding(1252);
if (null != _buffer)
{
sdata = encoding.GetString(_buffer);
}
string[] string_array = sdata.Split('$');
string Gpgga = null;
for (int i = 0; i < string_array.Length; i++)
{
string stringTemp = string_array[i];
string[] line_array = stringTemp.Split(',');
if (line_array[0] == "GPGGA")
{
Gpgga = string.Join(",", string_array[i]);
}
}
this.LastGpgga = Gpgga;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.