1

我正在创建一个 Windows 窗体应用程序,但遇到了一个问题。我正在从串口读取数据。

string RxString = serialPort1.ReadExisting();

这很好用,但我现在想做的是从我的值中提取值RxString并将它们放入自己的字符串数组中。

这是 RxString 格式:

GPS:050.1347,N,00007.3612,WMAG:+231\r\n

随着从串行端口添加更多数据,它会重复自身,数字会发生变化但长度保持不变,+ 会变为 -。我想将 GPS: 和 ,N 之间的数字放入一个字符串数组中,将 N 和 ,W 之间的数字放入另一个字符串数组中,最后将 + 和 \r\n 之间的数字放入第三个字符串数组中。

我该怎么做呢?

4

5 回答 5

3

好的,正则表达式解决方案:

        string pattern = @"^GPS:(?<gps>.{8}),N,(?<n>.{10}),WMAG:(\+|\-)(?<wmag>.{3})\\r\\n$";

        string gps = string.Empty;
        string n = string.Empty;
        string wmag = string.Empty;

        string input = @"GPS:050.1347,N,00007.3612,WMAG:+231\r\n";

        Regex regex = new Regex(pattern);

        if (regex.IsMatch(input))
        {
            Match match = regex.Match(input);

            foreach (Capture capture in match.Groups["gps"].Captures)
                gps = capture.Value;

            foreach (Capture capture in match.Groups["n"].Captures)
                n = capture.Value;

            foreach (Capture capture in match.Groups["wmag"].Captures)
                wmag = capture.Value;
        }

        Console.Write("GPS: ");
        Console.WriteLine(gps);

        Console.Write("N: ");
        Console.WriteLine(n);

        Console.Write("WMAG: ");
        Console.WriteLine(wmag);

        Console.ReadLine();
于 2013-03-26T19:30:32.857 回答
1

尝试这个:

string RxString = serialPort1.ReadExisting();

string latitude = RxString.Split(',')[0].Substring(4);
string longitude = RxString.Split(',')[2];
string mag = RxString.Split(',')[3].Substring(6).Trim();
于 2013-03-26T19:15:15.653 回答
0

我确信有一些正则表达式可以使这个更漂亮,但我不擅长正则表达式,所以我会检查 C# 的 String.Split 函数。如果您知道数字的长度相同,则子字符串会起作用,但如果这不能保证,那么拆分将是您最好的选择。你可以用逗号分割每一行,创建一个数组,然后使用 Replace 删除额外的文本(如 GPS: 和 WMAG:),如果你知道每次都一样的话。

于 2013-03-26T19:15:05.267 回答
0

If the string is always the same length, the best way is to use substring() method.

于 2013-03-26T19:12:52.513 回答
0

这不是最好的解决方案,因为它使用“魔术”数字和子字符串 - 但可能适用于您的情况,因为您说字符串长度始终相同。

var serialPortInfo = "GPS:050.1347,N,00007.3612,WMAG:+231\r\n";

private List<string> value1 = new List<string>();
private List<string> value2 = new List<string>();
private List<string> value3 = new List<string>();

private void populateValues(string s)
{
    // this should give an array of the following: 
    // values[0] = "050.1347"
    // values[1] = "N"
    // values[2] = "00007.3612"
    // values[3] = "WMAG:+231"
    //
    var values = (s.Substring(4, (s.Length - 8))).Split(','); 

    // populate lists
    //
    value1.Add(values[0]);
    value2.Add(values[2]); 
    value3.Add(values[3].Substring(6, 3));
}

//usage
populateValues(serialPortInfo);
于 2013-03-26T19:39:12.740 回答