C# 串口数据的字符串操作

C# 串口数据的字符串操作,c#,string,C#,String,我正在创建一个windows窗体应用程序,遇到了一个问题。我正在从串行端口读取数据 string RxString = serialPort1.ReadExisting(); 这很好,但我现在想做的是从我的RxString中提取值,并将它们放入它们自己的字符串数组中 这是RxString格式: GPS:050.1347,N,00007.3612,WMAG:+231\r\n 当从串行端口添加更多数据时,它会重复自身。数字会更改,但长度不变,+会更改为-。我想把GPS:and,N之间的数字放在一

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

string RxString = serialPort1.ReadExisting();
这很好,但我现在想做的是从我的
RxString
中提取值,并将它们放入它们自己的字符串数组中

这是RxString格式:

GPS:050.1347,N,00007.3612,WMAG:+231\r\n
当从串行端口添加更多数据时,它会重复自身。数字会更改,但长度不变,+会更改为-。我想把GPS:and,N之间的数字放在一个字符串数组中,把N,and,W之间的数字放在另一个字符串数组中,最后把+和\r\N之间的数字放在第三个字符串数组中


我该怎么做呢?

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

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

我确信有一些正则表达式可以使这个更漂亮,但我对正则表达式不太在行,所以我想签出C#的String.Split函数。如果知道数字的长度相同,子字符串就可以工作,但如果这不能保证,拆分将是最好的选择。
你可以分割逗号上的每一行,创建一个数组,然后使用Replace删除多余的文本(如GPS:和WMAG:),如果你知道每次都是一样的话。

我肯定有一些正则表达式可以使这个更漂亮,但我不擅长正则表达式,所以我要签出C#的String.split函数。如果知道数字的长度相同,子字符串就可以工作,但如果这不能保证,拆分将是最好的选择。 您可以拆分逗号上的每一行,创建一个数组,然后使用“替换”删除多余的文本(如GPS:和WMAG:),如果您知道每次都是一样的话。

尝试以下方法:

string RxString = serialPort1.ReadExisting();

string latitude = RxString.Split(',')[0].Substring(4);
string longitude = RxString.Split(',')[2];
string mag = RxString.Split(',')[3].Substring(6).Trim();
试试这个:

string RxString = serialPort1.ReadExisting();

string latitude = RxString.Split(',')[0].Substring(4);
string longitude = RxString.Split(',')[2];
string mag = RxString.Split(',')[3].Substring(6).Trim();
好的,正则表达式解决方案:

        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();
string模式=@“^GPS:(?。{8})、N、(?。{10})、WMAG:(\+\124; \-)(?。{3})\\r\\N$”;
字符串gps=string.Empty;
string n=string.Empty;
string wmag=string.Empty;
字符串输入=@“GPS:050.1347,N,00007.3612,WMAG:+231\r\N”;
正则表达式正则表达式=新正则表达式(模式);
if(regex.IsMatch(输入))
{
匹配=正则表达式匹配(输入);
foreach(在match.Groups[“gps”]中捕获。捕获)
gps=捕获值;
foreach(在match.Groups[“n”].捕获中捕获)
n=捕获值;
foreach(在match.Groups[“wmag”].捕获中捕获)
wmag=capture.Value;
}
控制台。写入(“GPS:”);
控制台写入线(gps);
控制台。写(“N:”);
控制台写入线(n);
Console.Write(“WMAG:”);
控制台写入线(wmag);
Console.ReadLine();
好的,正则表达式解决方案:

        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();
string模式=@“^GPS:(?。{8})、N、(?。{10})、WMAG:(\+\124; \-)(?。{3})\\r\\N$”;
字符串gps=string.Empty;
string n=string.Empty;
string wmag=string.Empty;
字符串输入=@“GPS:050.1347,N,00007.3612,WMAG:+231\r\N”;
正则表达式正则表达式=新正则表达式(模式);
if(regex.IsMatch(输入))
{
匹配=正则表达式匹配(输入);
foreach(在match.Groups[“gps”]中捕获。捕获)
gps=捕获值;
foreach(在match.Groups[“n”].捕获中捕获)
n=捕获值;
foreach(在match.Groups[“wmag”].捕获中捕获)
wmag=capture.Value;
}
控制台。写入(“GPS:”);
控制台写入线(gps);
控制台。写(“N:”);
控制台写入线(n);
Console.Write(“WMAG:”);
控制台写入线(wmag);
Console.ReadLine();

这不是最好的解决方案,因为它使用了“魔法”数字和子字符串-但可能适合您的情况,因为您说过字符串长度总是相同的

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);
var serialPortInfo=“GPS:050.1347,N,00007.3612,WMAG:+231\r\N”;
私有列表值1=新列表();
私有列表值2=新列表();
私有列表值3=新列表();
私有void populateValues(字符串s)
{
//这将提供以下内容的数组:
//值[0]=“050.1347”
//值[1]=“N”
//值[2]=“00007.3612”
//值[3]=“WMAG:+231”
//
var值=(s.Substring(4,(s.Length-8)).Split(',');
//填充列表
//
值1.添加(值[0]);
价值2.增加(价值[2]);
value3.Add(值[3]。子字符串(6,3));
}
//用法
populateValues(serialPortInfo);

这不是最好的解决方案,因为它使用了“魔法”数字和子字符串-但可能适合您的情况,因为您说过字符串长度总是相同的

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);
var serialPortInfo=“GPS:050.1347,N,00007.3612,WMAG:+231\r\N”;
私有列表值1=新列表();
私有列表值2=新列表();
私有列表值3=新列表();
私有void populateValues(字符串s)
{
//这将提供以下内容的数组:
//值[0]=“050.1347”
//值[1]=“N”
//值[2]=“00007.3612”
//值[3]=“WMAG:+231”
//
var值=(s.Substring(4,(s.Length-8)).Split(',');
//填充列表
//
值1.添加(值[0]);
价值2.增加(价值[2]);
value3.Add(值[3]。子字符串(6,3));
}
//用法
populateValues(serialPortInfo);

使用regex可以非常轻松地完成这项工作。到目前为止您尝试了什么?尝试String.Split(…)当怀疑是真的时,毫无疑问是愚蠢的。我尝试过String spit,但不知道如何使用它。不理解如果我有MAG:“要提取的数据”\r\n这可以用regex很容易地完成。到目前为止,您尝试过什么?尝试String.Split(…)当怀疑是真的时,毫无疑问是愚蠢的。我尝试过String spit,但不知道如何使用它。不理解如果我有MAG:“要提取的数据”\r\n我不确定这是否是最好的解决方案,但它可能是最容易编码的。B