【发布时间】:2021-04-16 13:21:21
【问题描述】:
我已经用 C# (winforms) 为一个项目编写代码 2 周了。我的目标是为 FFT 分析(频率域)构建一个 GUI。
我的问题:
我一直遇到同样的问题:我通过串行端口在一个字符串中接收由空格分隔的 1024 个 int 值(一个块大小),然后由 \n 终止到缓冲区 uart_buf。为了获得数值,我使用 uart_buf.split(' ') 到 string[] parse_buf 中,然后尝试访问 ASCII 格式的单个值,如下所示:parse_buf[i] = val_buf。然后我尝试通过 value = int.Parse(val_buf) 形成一个数字,但没有成功: System.ArgumentNullException: value cant be NULL.
我的尝试:
- 值 = int.Parse(parse_buf[i]);这会返回格式异常
- 将 parse_buf[i] 打印到文本框会显示预期值(接收到的数据正确)
- 观察主缓冲区 uart_buf 显示如下有效数据:“41 30 2 0 0 0 0 0 0 0 3 40 500 69...”
- 从索引 1(或任何其他)而不是 0 开始没有任何变化
我没有得到什么:
parse_buf 的单个元素(即字符串)包含文本形式的值,例如“41”。我想将它保存到一个常规字符串 val_buf,我应该能够将其解析为 int。为什么通过 parse_buf[i] 访问的每个字符串都是空的?
代码片段:
private void displayData(object o, EventArgs e)
{
parse_buf = uart_buf.Split(' ');
tb_data.Text = parse_buf[0]; //this shows valid data in a tb
for (i = 1; i < parse_buf.Length; i++) //about 1024 loops
{
//problem area:
parse_buf[i] = val_buf;
fft = int.Parse(val_buf);
//ignore this:
f = i * 20;
chart1.Series[0].Points.AddXY(f, fft);
}
}
我通常在嵌入式系统中使用 C 语言,很抱歉没有立即发现问题。谢谢。
【问题讨论】:
-
我怀疑
parse_buf[i] = val_buf;应该是val_buf= parse_buf[i];。很难说,因为我们不知道val_buf的预期目的或声明的位置。 (你为什么要使用它?为什么不只使用fft = int.Parse(parse_buf[i]);?为什么fft显然是一个字段而不是局部变量?同上val_buf和parse_buf。尽可能使用局部变量。)跨度> -
除此之外,我强烈建议在编写 .NET 代码时遵循 .NET 命名约定。
-
另外,您可能希望从索引 0 开始循环,因为目前您缺少数组中的第一个元素。
-
正如 derpischer 指出的那样,索引是错误的,这是先前实验留下的。现在又从 0 开始了。
-
就像 Jon Skeet 提到的, parse_buf[i] = val_buf 不仅被错误地翻转,而且是不必要的;它已被删除。尽管如此,就像我在“我尝试过的事情”中提到的那样: value = int.Parse(parse_buf[i]);这会返回格式异常,格式错误。除了字符串,它还期待什么?