1

Windowsフォームアプリケーションの作成に取り組んでいますが、問題が発生しました。シリアルポートからデータを読み込んでいます。

string RxString = serialPort1.ReadExisting();

これは正常に機能しますが、私が今やりたいのは、自分から値を抽出し、RxStringそれらを独自の文字列配列に配置することです。

これはRxString形式です。

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

シリアルポートからさらにデータが追加されると、番号は変わりますが同じ長さのままで、+が-に変わります。GPS:と、Nの間の数値を1つの文字列配列に入れ、Nと、Wの間の数値を別の文字列配列に入れ、最後に+と\ r\nの間の数値を3番目の文字列配列に入れます。

どうすればこれを行うことができますか?

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

文字列が常に同じ長さである場合、最良の方法はsubstring()メソッドを使用することです。

于 2013-03-26T19:12:52.513 に答える
0

これをより美しくすることができるいくつかの正規表現があると確信していますが、私は正規表現が得意ではないので、C#のString.Split関数をチェックアウトします。数字が同じ長さになることがわかっている場合は部分文字列が機能しますが、それが保証されていない場合は、分割が最善の策です。毎回同じになることがわかっている場合は、コンマで各行を分割して配列を作成し、[置換]を使用して余分なテキスト(GPS:やWMAG :など)を削除できます。

于 2013-03-26T19:15:05.267 に答える
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 に答える