C# 格式化字符串从串行端口删除或子字符串没有例外,如何?

C# 格式化字符串从串行端口删除或子字符串没有例外,如何?,c#,C#,我用这段代码来接收秤的重量 对于带有.ToString的部分,一切都很好,但是当我调用.Remove(9,5)时,它会抛出一个ArgumentOutOfRangeException。为什么?我没有超出范围 private delegate void Closure(); private void sport_DataReceived2(object sender, SerialDataReceivedEventArgs serialDataReceivedEventArgs) { if

我用这段代码来接收秤的重量

对于带有
.ToString
的部分,一切都很好,但是当我调用
.Remove(9,5)
时,它会抛出一个
ArgumentOutOfRangeException
。为什么?我没有超出范围

private delegate void Closure();

private void sport_DataReceived2(object sender, SerialDataReceivedEventArgs serialDataReceivedEventArgs)
{
    if (InvokeRequired)     //<-- Makes sure the function is invoked to work properly in the UI-Thread
        BeginInvoke(new Closure(() => { sport_DataReceived2(sender, serialDataReceivedEventArgs); }));     //<-- Function invokes itself
    else
    {
        while (sport.BytesToRead > 0) //<-- repeats until the In-Buffer is empty
        {
            textBox1.Text += string.Format("{0:X2} ", sport.ReadExisting().ToString().Remove(9, 5));
            //<-- bytewise adds inbuffer to textbox
        }
    }
}
private delegate void Closure();
私有void sport_DataReceived2(对象发送方,SerialDataReceivedEventArgs SerialDataReceivedEventArgs)
{
如果(invokererequired)//{sport_DataReceived2(sender,serialDataReceivedEventArgs);}));//0)//尝试

它从第3个位置开始,总共有8个字符,因此它应该返回您想要的字符串。

试试看

sport.ReadExisting().ToString().Substring(2, 8)
它从第3个位置开始,总共有8个字符,因此它应该返回您想要的字符串。

试试看

sport.ReadExisting().ToString().Substring(2, 8)
它从第3个位置开始,总共有8个字符,因此它应该返回您想要的字符串。

试试看

sport.ReadExisting().ToString().Substring(2, 8)

它从第3个位置开始,有8个字符,因此它应该返回您想要的字符串。

我认为在这里它不是一个最好的使用方法。删除

sport.ReadExisting().ToString()子字符串(9,5)


试试这个吧

我认为在这里使用它不是最好的选择。删除

sport.ReadExisting().ToString()子字符串(9,5)


试试这个吧

我认为在这里使用它不是最好的选择。删除

sport.ReadExisting().ToString()子字符串(9,5)


试试这个吧

我认为在这里使用它不是最好的选择。删除

sport.ReadExisting().ToString()子字符串(9,5)


如果这些是换行符和回车符,则可以使用

这将创建一个大小为5的数组,其中第二项是您想要的,因此
[1]
。这将确保您不必担心值的长度。此外,如果您收到的输入中没有至少1个空格字符,则应添加检查以确保数组中至少有两个值


但是,如果您的字符串确实是“\n00.394KG\r\nS00\r”,那么
。Remove(9,5)
不会抛出您指示的异常。相反,您应该得到“\n00.394KG\r”。因此,我猜您实际上有一个较短的字符串,因此需要拆分。

如果这些是换行符和回车符,那么您可以使用

这将创建一个大小为5的数组,其中第二项是您想要的,因此
[1]
。这将确保您不必担心值的长度。此外,如果您收到的输入中没有至少1个空格字符,则应添加检查以确保数组中至少有两个值


但是,如果您的字符串确实是“\n00.394KG\r\nS00\r”,那么
。Remove(9,5)
不会抛出您指示的异常。相反,您应该得到“\n00.394KG\r”。因此,我猜您实际上有一个较短的字符串,因此需要拆分。

如果这些是换行符和回车符,那么您可以使用

这将创建一个大小为5的数组,其中第二项是您想要的,因此
[1]
。这将确保您不必担心值的长度。此外,如果您收到的输入中没有至少1个空格字符,则应添加检查以确保数组中至少有两个值


但是,如果您的字符串确实是“\n00.394KG\r\nS00\r”,那么
。Remove(9,5)
不会抛出您指示的异常。相反,您应该得到“\n00.394KG\r”。因此,我猜您实际上有一个较短的字符串,因此需要拆分。

如果这些是换行符和回车符,那么您可以使用

这将创建一个大小为5的数组,其中第二项是您想要的,因此
[1]
。这将确保您不必担心值的长度。此外,如果您收到的输入中没有至少1个空格字符,则应添加检查以确保数组中至少有两个值


但是,如果您的字符串确实是“\n00.394KG\r\nS00\r”,那么
。Remove(9,5)
不会抛出您指示的异常。相反,您应该得到“\n00.394KG\r”。因此,我猜您实际上有一个较短的字符串,因此需要拆分。

使用正则表达式解决方案

var x = "\n00.394KG\r\nS00\r";
var match = Regex.Match(@"(?<serial>\d+\.\d+\w+)", x);
if (!match.Success) throw new FormatException(); // invalid format..
var serial = match.Groups["serial"].Value;
var x=“\n00.394KG\r\nS00\r”;
var match=Regex.match(@“(?\d+\.\d+\w+”,x);
如果(!match.Success)抛出新FormatException();//格式无效。。
var serial=匹配组[“serial”].值;

选择正则表达式解决方案

var x = "\n00.394KG\r\nS00\r";
var match = Regex.Match(@"(?<serial>\d+\.\d+\w+)", x);
if (!match.Success) throw new FormatException(); // invalid format..
var serial = match.Groups["serial"].Value;
var x=“\n00.394KG\r\nS00\r”;
var match=Regex.match(@“(?\d+\.\d+\w+”,x);
如果(!match.Success)抛出新FormatException();//格式无效。。
var serial=匹配组[“serial”].值;

选择正则表达式解决方案

var x = "\n00.394KG\r\nS00\r";
var match = Regex.Match(@"(?<serial>\d+\.\d+\w+)", x);
if (!match.Success) throw new FormatException(); // invalid format..
var serial = match.Groups["serial"].Value;
var x=“\n00.394KG\r\nS00\r”;
var match=Regex.match(@“(?\d+\.\d+\w+”,x);
如果(!match.Success)抛出新FormatException();//格式无效。。
var serial=匹配组[“serial”].值;

选择正则表达式解决方案

var x = "\n00.394KG\r\nS00\r";
var match = Regex.Match(@"(?<serial>\d+\.\d+\w+)", x);
if (!match.Success) throw new FormatException(); // invalid format..
var serial = match.Groups["serial"].Value;
var x=“\n00.394KG\r\nS00\r”;
var match=Regex.match(@“(?\d+\.\d+\w+”,x);
如果(!match.Success)抛出新FormatException();//格式无效。。
var serial=匹配组[“serial”].值;

一般来说,在运行时读取的字符串上使用
Remove
/
Substring
或任何其他依赖于大小的方法是一个坏主意,因为您通常无法控制字符串源的行为,如果该字符串与编译时预期的字符串略有不同,则会遇到麻烦

如果您进行如下测试,您的代码就是一个完美的示例:

Console.WriteLine("\n00.394KG\r\nS00\r".Remove(9, 5));
然后,您可以看到调用remove并不是问题所在,但是您尝试处理的字符串与您预期的不同。可能是一个较短的字符串,因为这将生成一个
ArgumentOutOfRangeException

一个安全的方法是对任何接收到的str使用正则表达式