首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C#中通过串口读取GPS数据?

如何在C#中通过串口读取GPS数据?
EN

Stack Overflow用户
提问于 2013-11-28 17:09:45
回答 2查看 4.1K关注 0票数 0

我想通过串口在C#中使用全球定位系统获得全球定位系统的数据。我创建了ParseNMEA类来获取NMEA数据,解析它并获取$GPGAA。这就是班级。

代码语言:javascript
复制
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中调用这个类。如下所示:

代码语言:javascript
复制
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事件有任何问题。如果你有任何想法。请帮帮我。

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2013-11-28 18:51:33

从设备传输的数据是字符串还是字节?您正在读取数据,就好像它是以字节为单位传入的,但随后您将其转换为字符串值。如果它是以字符串形式出现的,只需使用port.ReadLine()方法,但请确保将port.NewLine属性设置为与设备传输的任何换行符或字符序列相对应。或者,您可以使用port.ReadTo()方法并指定要查找的字符串。你到底有没有得到任何数据?如果没有,找出您的设备需要哪种类型的握手,并将port.Handshake属性设置为匹配。

票数 0
EN

Stack Overflow用户

发布于 2013-11-28 20:42:28

GetGpgga()中,你看起来并不是在等待数据被接收--我希望得到的东西更像(未测试的):

代码语言:javascript
复制
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;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20261806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档