Вы можете сделать это с помощью регулярного выражения или путем разделения полученной строки, используя '$' - поскольку каждая строка начинается с этого символа.
// Holds the partial/unprocessed data we've read from the serial port.
private string _serialRxString = string.Empty;
private void Start_Click(object sender, EventArgs e)
{
serialRxString = string.Empty;
serialPort1.Open();
}
private void Read_Click(object sender, EventArgs e)
{
// Add the new data to what we have.
_serialRxString += serialPort1.ReadExisting();
// Each line starts with a '$'.
string[] lines = _serialRxString.Split(
new char[] { '$' },
StringSplitOptions.None);
// Don't process the last one yet, it might not be complete.
for (int i = 0; i < lines.Length - 1; i++)
{
// Check if it's the line we're looking for.
if (lines[i].StartsWith("GPGGA"))
{
string[] values = lines[i].Split(new char[] { ',' });
// Do what you want with the values from the $GPGGA line.
}
}
// Keep the last line, since it might not be complete yet.
_serialRxString = lines.Last();
}
Вы также можете захотеть подписаться на последовательный портданные получили событие.Таким образом, любые данные, полученные через последовательный порт, будут автоматически обрабатываться без нажатия кнопки чтения.Вы можете сделать это либо через конструктор, либо через конструктор формы.Тогда событие получения данных будет таким же, как в приведенной выше функции Read_Click
.
Чтобы подписаться на событие DataReceived
в конструкторе:
Или в конструкторе:
public Form1()
{
InitializeComponent();
serialPort1.DataReceived += serialPort1_DataReceived;
}
Событие получения данных тогда будет:
private void serialPort1_DataReceived(
object sender,
SerialDataReceivedEventArgs e)
{
// Add the new data to what we have.
_serialRxString += serialPort1.ReadExisting();
// Each line starts with a '$'.
string[] lines = _serialRxString.Split(
new char[] { '$' },
StringSplitOptions.None);
// Don't process the last one yet, it might not be complete.
for (int i = 0; i < lines.Length - 1; i++)
{
// Check if it's the line we're looking for.
if (lines[i].StartsWith("GPGGA"))
{
string[] values = lines[i].Split(new char[] { ',' });
// Do what you want with the values from the $GPGGA line.
}
}
// Keep the last line, since it might not be complete yet.
_serialRxString = lines.Last();
}
Затем, когда что-либо будет получено по последовательному порту, эта функцияавтоматически вызывается.
Есть также несколько пакетов, доступных для анализа сообщений NMEA, которые могут оказаться полезными.Вот такой: NmeaParser