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

C#串口应用如何将串口配置数据保存到.ini文件以便复用?

C#串口程序保存配置到.ini并启动自动加载

实现思路

要实现关闭程序时保存串口配置到.ini、启动时自动复用配置,核心要完成三个步骤:

  • 调用Win32 API读写.ini文件(C#原生无直接操作.ini的类,系统API最贴合需求)
  • 在保存按钮点击或窗体关闭时写入配置
  • 在窗体启动时读取.ini并恢复配置

完整代码实现

1. 引入API及定义配置路径

在窗体类顶部添加以下代码,引入操作.ini的系统API,并指定配置文件存放路径:

using System.IO;
using System.Runtime.InteropServices;
using System.Text;

// 操作INI文件的Win32 API
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool WritePrivateProfileString(string lpAppName, string lpKeyName, string lpString, string lpFileName);

[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
private static extern uint GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, uint nSize, string lpFileName);

// 配置文件路径:程序根目录下的SerialConfig.ini
private string _configPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "SerialConfig.ini");

2. 修改保存按钮事件

修正你现有btnSave_Click方法的逻辑,确保配置写入.ini后再关闭窗体:

private void btnSave_Click(object sender, EventArgs e)
{
    try
    {
        // 更新串口对象配置
        _Ser.PortName = cBoxPort.Text;
        _Ser.BaudRate = Convert.ToInt32(cBoxBaud.Text);
        _Ser.DataBits = Convert.ToInt32(cBoxDatabits.Text);
        _Ser.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cBoxStopBits.Text);
        _Ser.Parity = (Parity)Enum.Parse(typeof(Parity), cBoxParitybits.Text);

        // 将配置写入INI文件
        WritePrivateProfileString("SerialConfig", "PortName", cBoxPort.Text, _configPath);
        WritePrivateProfileString("SerialConfig", "BaudRate", cBoxBaud.Text, _configPath);
        WritePrivateProfileString("SerialConfig", "DataBits", cBoxDatabits.Text, _configPath);
        WritePrivateProfileString("SerialConfig", "StopBits", cBoxStopBits.Text, _configPath);
        WritePrivateProfileString("SerialConfig", "Parity", cBoxParitybits.Text, _configPath);

        MessageBox.Show("Configuration has been saved", "Status");
        this.Close();
    }
    catch (Exception err)
    {
        MessageBox.Show(err.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

3. 添加窗体关闭自动保存

如果用户直接关闭窗体而不点保存按钮,也需自动保存当前配置,添加FormClosing事件处理:

private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    try
    {
        // 保存当前控件中的配置到INI
        WritePrivateProfileString("SerialConfig", "PortName", cBoxPort.Text, _configPath);
        WritePrivateProfileString("SerialConfig", "BaudRate", cBoxBaud.Text, _configPath);
        WritePrivateProfileString("SerialConfig", "DataBits", cBoxDatabits.Text, _configPath);
        WritePrivateProfileString("SerialConfig", "StopBits", cBoxStopBits.Text, _configPath);
        WritePrivateProfileString("SerialConfig", "Parity", cBoxParitybits.Text, _configPath);
    }
    catch (Exception err)
    {
        MessageBox.Show($"Failed to save config: {err.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

4. 启动时加载配置

在窗体Load事件中读取.ini文件,恢复上次的配置:

private void MainForm_Load(object sender, EventArgs e)
{
    if (!File.Exists(_configPath))
        return;

    try
    {
        // 读取INI中的配置项
        StringBuilder portName = new StringBuilder(255);
        GetPrivateProfileString("SerialConfig", "PortName", "", portName, 255, _configPath);
        
        StringBuilder baudRate = new StringBuilder(255);
        GetPrivateProfileString("SerialConfig", "BaudRate", "", baudRate, 255, _configPath);
        
        StringBuilder dataBits = new StringBuilder(255);
        GetPrivateProfileString("SerialConfig", "DataBits", "", dataBits, 255, _configPath);
        
        StringBuilder stopBits = new StringBuilder(255);
        GetPrivateProfileString("SerialConfig", "StopBits", "", stopBits, 255, _configPath);
        
        StringBuilder parity = new StringBuilder(255);
        GetPrivateProfileString("SerialConfig", "Parity", "", parity, 255, _configPath);

        // 恢复控件和串口对象的配置
        if (!string.IsNullOrEmpty(portName.ToString()))
        {
            cBoxPort.Text = portName.ToString();
            _Ser.PortName = portName.ToString();
        }
        if (!string.IsNullOrEmpty(baudRate.ToString()))
        {
            cBoxBaud.Text = baudRate.ToString();
            _Ser.BaudRate = Convert.ToInt32(baudRate.ToString());
        }
        if (!string.IsNullOrEmpty(dataBits.ToString()))
        {
            cBoxDatabits.Text = dataBits.ToString();
            _Ser.DataBits = Convert.ToInt32(dataBits.ToString());
        }
        if (!string.IsNullOrEmpty(stopBits.ToString()))
        {
            cBoxStopBits.Text = stopBits.ToString();
            _Ser.StopBits = (StopBits)Enum.Parse(typeof(StopBits), stopBits.ToString());
        }
        if (!string.IsNullOrEmpty(parity.ToString()))
        {
            cBoxParitybits.Text = parity.ToString();
            _Ser.Parity = (Parity)Enum.Parse(typeof(Parity), parity.ToString());
        }
    }
    catch (Exception err)
    {
        MessageBox.Show($"Failed to load config: {err.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

注意事项

  • 权限问题:如果程序安装在Program Files目录,可能没有写入权限,建议将.ini文件放在Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)目录下
  • 异常处理:读取配置时要处理枚举转换失败、数值转换失败的情况,可设置默认值(比如波特率默认9600)
  • 控件初始化:确保串口配置的下拉框(如cBoxBaud)在加载前已经填充了可选值,避免读取的配置无法匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:25:26