You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#串口接收多数据转整数时遇FormatException异常求助

嘿,这个问题我太熟悉了!你碰到的System.FormatException说白了就是:你想转成整数的字符串根本不是合法的数字格式,要么是串口读进来的数据跑偏了,要么是拆分后的内容不对。咱们一步步来搞定它:

先搞懂为啥报错

这个错误直接砸在Int32.Parse()上——它拿到的字符串不是有效的整数格式,常见的坑有这几个:

  • 串口读取的内容带了多余字符:比如换行符\r\n、空格、制表符,甚至传输时的乱码
  • 拆分后的数组有问题:比如数据开头/结尾多了个逗号,拆出空字符串;或者压根没读到两组数据,数组长度不够
  • 发送端传的数据本身就不是纯数字(比如不小心混了字母)
分步解决办法

1. 先查清楚串口到底读了啥

在拆分之前,先把原始数据打出来看看,比如用控制台输出或者弹窗:

string rawData = serialPort1.ReadExisting();
Console.WriteLine($"原始串口数据: '{rawData}'"); // 用引号括起来能看清有没有隐藏字符

这一步能快速定位:是不是数据里有"123,\r\n456"这种带换行的?或者" 789, 101"带空格的?这些都会让转换直接失败。

2. 先把数据洗干净

拿到原始数据后,先去掉无关的干扰字符:

// 去掉换行、空格、制表符这些常见干扰
string cleanedData = rawData.Trim(new char[] {'\r', '\n', ' ', '\t'});
// 如果还有其他奇怪字符,用正则只保留数字和逗号
using System.Text.RegularExpressions;
cleanedData = Regex.Replace(cleanedData, @"[^0-9,]", "");

3. 安全拆分,别直接硬取数组元素

拆分的时候记得过滤空元素,还要检查数组长度,避免越界:

string[] c = cleanedData.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries);
// 先确保至少有两组有效数据
if (c.Length < 2)
{
    // 这里处理数据不全的情况,比如提示"串口数据不完整"
    return;
}

4. 用安全的转换方法代替Int32.Parse()

别用Parse()这种“脾气大”的方法,改用Int32.TryParse()——它不会直接抛异常,而是返回成功/失败的布尔值,容错性强多了:

int b, d;
// 只有两个元素都成功转成整数,才执行后续逻辑
if (Int32.TryParse(c[0], out b) && Int32.TryParse(c[1], out d))
{
    // 这里写你的if判断逻辑
    if (b > 50 && d < 20)
    {
        // 比如执行某个操作
    }
}
else
{
    // 处理转换失败的情况,比如记录日志或者提示用户"数据格式错误"
}

5. 进阶建议:和发送端约定帧格式

如果经常遇到这种问题,最好和串口发送端约定固定的帧格式,比如用#开头、;结尾,比如"#123,456;"。这样你可以先判断数据是否完整,再提取有效部分:

if (rawData.StartsWith("#") && rawData.EndsWith(";"))
{
    // 提取中间的数字部分
    string dataPart = rawData.Substring(1, rawData.Length - 2);
    // 再对dataPart进行拆分和转换
}

内容的提问来源于stack exchange,提问作者Barney Twist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:28:47