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
相关产品推荐
相关产品推荐

