串行端口数据的字符串操作

时间:2013-03-26 19:09:17

标签: c# string

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

string RxString = serialPort1.ReadExisting();

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

这是RxString格式:

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

它重复自身,因为从串口添加的数据越多,数字就会改变,但保持相同的长度,+变为 - 。我想把GPS:和N之间的数字放在一个字符串数组中,N之间的数字,和另一个字符串数组中的W,最后是第三个字符串数组中+和\ r \ n之间的数字。

我将如何做到这一点?

5 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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();

答案 2 :(得分:0)

如果字符串的长度始终相同,最好的方法是使用substring()方法。

答案 3 :(得分:0)

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

答案 4 :(得分: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);