C# 如何连续读取和解析高速串行端口数据

C# 如何连续读取和解析高速串行端口数据,c#,gps,serial-port,readline,continuous,C#,Gps,Serial Port,Readline,Continuous,我正试图编写C#代码,从高速GPS设备获取串行端口数据,并解析数据以获取坐标 与其他串行GPS设备相比,它的问题在于,它每100毫秒输出5-6行数据,而不是每秒输出相同的数据。因此,基本上,每0.1秒,我会得到5或6行数据突发,只要设备打开,这些数据将持续不断 当我在模拟的标准速度GPS设备上试用时,它工作得很好 这是我每秒有一次5线突发。但当它加速10倍时,它就停止工作了。基本上,我得到的效果是,SerialDataReceivedEventHandler根本不触发 那么,对本质上是超高速串行

我正试图编写C#代码,从高速GPS设备获取串行端口数据,并解析数据以获取坐标

与其他串行GPS设备相比,它的问题在于,它每100毫秒输出5-6行数据,而不是每秒输出相同的数据。因此,基本上,每0.1秒,我会得到5或6行数据突发,只要设备打开,这些数据将持续不断

当我在模拟的标准速度GPS设备上试用时,它工作得很好

这是我每秒有一次5线突发。但当它加速10倍时,它就停止工作了。基本上,我得到的效果是,
SerialDataReceivedEventHandler
根本不触发

那么,对本质上是超高速串行端口数据转储的数据进行连续读取的最佳方法是什么呢

我的代码如下。对于你们GPS的家伙来说,这个特殊的接收器的波特率是非标准的115200,而不是标准的4800。我验证了它与PuTTY以及Windows的现成GPS软件一起工作

    public List<double[]> coords = new List<double[]>();
    SerialPort com;
        ...
        try
        {
            com = new SerialPort(COMPORT);
            com.BaudRate = 115200;
            com.DataBits = 8;
            com.StopBits = StopBits.One;
            com.Handshake = Handshake.None;
            com.Open();

            com.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
        }
        catch (Exception e)
        {
            System.Windows.Forms.MessageBox.Show(e.Message);
        }
    }

    public void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort port = (SerialPort)sender;
        double longitude = -1000;
        double latitude = -1000;
        double altitude = -1000;
        string sentence = port.ReadLine();
        if (sentence.StartsWith("$GPGGA"))
        {
            string[] values = sentence.Split(',');

            if (values[2].Length > 1 && values.Count() > 10)
            {
                latitude = double.Parse(values[2].Substring(0, values[2].IndexOf('.') - 2));
                latitude += double.Parse(values[2].Substring(values[2].IndexOf('.') - 2)) / 60;
                if (values[3] == "S")
                    latitude = 0 - latitude;
                longitude = double.Parse(values[4].Substring(0, values[4].IndexOf('.') - 2));
                longitude += double.Parse(values[4].Substring(values[4].IndexOf('.') - 2)) / 60;
                if (values[5] == "W")
                    longitude = 0 - longitude;
                altitude = double.Parse(values[9]);

                coords.RemoveAt(0);
                coords.Add(new double[] { longitude, latitude, altitude });
            }

            else
            {
                coords.RemoveAt(0);
                coords.Add(coords.Last());
            }
        }
    }
public List coords=new List();
串口通信;
...
尝试
{
com=新的串行端口(COMPORT);
com.BaudRate=115200;
com.DataBits=8;
com.StopBits=StopBits.One;
com.Handshake=Handshake.None;
com.Open();
com.DataReceived+=新的SerialDataReceivedHandler(DataReceivedHandler);
}
捕获(例外e)
{
System.Windows.Forms.MessageBox.Show(e.Message);
}
}
public void DataReceivedHandler(对象发送方,SerialDataReceivedEventArgs e)
{
SerialPort端口=(SerialPort)发送方;
双经度=-1000;
双纬度=-1000;
双高度=-1000;
字符串语句=port.ReadLine();
如果(句子.StartsWith(“$GPGGA”))
{
字符串[]值=句子.Split(',');
if(值[2].Length>1&&values.Count()>10)
{
latitude=double.Parse(值[2]。子字符串(0,值[2]。IndexOf('.')-2));
latitude+=double.Parse(值[2]。子字符串(值[2]。索引('.')-2))/60;
如果(值[3]=“S”)
纬度=0-纬度;
经度=double.Parse(值[4]。子字符串(0,值[4]。IndexOf('.')-2));
经度+=double.Parse(值[4]。子字符串(值[4]。索引('.')-2))/60;
如果(值[5]=“W”)
经度=0-经度;
高度=double.Parse(值[9]);
坐标移动(0);
添加(新的双[]{经度、纬度、高度});
}
其他的
{
坐标移动(0);
添加(coords.Last());
}
}
}

我认为问题出在port.ReadLine()上。电脑中的UART只有一个8字节的缓冲区。当收到超过8个字符的长行时,数据可能丢失。最好使用port.Read()而不是ReadLine。DataReceiveHandler应将所有可用字节读入缓冲区。然后检查缓冲区是否包含“\n”并按“\n”分割数据。