• 操作配置文件保存方式(上位机)


    上位机:(Supervisor Control) 指的是用于监视和控制其他设备或者系统的计算机,在工业自动化和过程控制领域
     上位机典型就是一台PC或者服务器,用于语各种下位机进行通信的,收集数据,并且根据收集的数据发送一些数据。
     典型的设备 电脑 平板 手机 触控屏等。

    c# 创建上位机程序 需要几个步骤
    1  使用c#软件开发设计界面(可以使用winform  wpf net开发界面)
    2  使用串口通信SerialPort类、以太网通信(通常的使用TCP或者UD P协议 或者在TCP或udp基础之上封装的协议
    (modbus协议)
    3  收集下位机的发送的数据,并将控制信号发送给下位机

     下位机:指的是与机器相连接的计算机或者单片机 或者芯片一类。 一般用于接受和反馈上位机的指令
    典型的设备 :PLC、 steam32、51、等

    ini文件:主要存放的是用户所做的选择后者系统各种参数
    c#没有对应的方法存取,通过c语言的kernel.dll方法进行读取,使用c语言的方法一定注意 和c#有点不一样。
    ini的文件的保存方式:

    Debug里创建File文件在创建Settting.txt文档,将后缀名改成ini

    写入

    项目创建IniHelper.cs类(通用封装)

    1. namespace 操作配置文件保存方式
    2. {
    3. public class IniHelper
    4. {
    5. public string FileName { get; set; }
    6. public IniHelper(string name)
    7. {
    8. this.FileName = name; //在构造函数中给路径赋值
    9. }
    10. //1 先导入c语言进行读取操作ini文件的方法
    11. //GetPrivateProfileString() 获取ini配置文件的数据
    12. //static 静态的变量 只能声明在当前文件中,不能在其他源文件进行使用。
    13. //extern 用来声明外部的符号 可以跨文件使用。
    14. [DllImport("Kernel32.dll")] //导入方法所在dll文件
    15. public static extern Int32 GetPrivateProfileString(
    16. string sectionName, //段名
    17. string keyName,//键名
    18. string defaultName,//当键不存在默认值。
    19. StringBuilder returnValue,// 读取到数据
    20. uint size,// 读取数据的大小
    21. string fileName// ini文件路径
    22. );
    23. // 2添加写入ini文件的c方法
    24. [DllImport("Kernel32.dll")]
    25. public static extern Int32 WritePrivateProfileString(
    26. string sectionName, //段名
    27. string keyName,//键名
    28. string value,//设置的值
    29. string fileName// ini文件路径
    30. );
    31. //不直接使用上面的俩个c语言的方法 再封装到其他方法进行使用
    32. //读取ini数据的方法
    33. //ReadData("Second","B","Setting.ini") "10"
    34. //参数1 段名 ,参数2键名 ,参数3是文件路径
    35. public static string ReadData(string sectionName,string keyName,string fileName)
    36. {
    37. StringBuilder sb = new StringBuilder(512); //512是存储的大小
    38. GetPrivateProfileString(sectionName, keyName, string.Empty, sb, 512, fileName);
    39. return sb.ToString();
    40. }
    41. //对上面ReadData再封装,封装能直接返回指定类型的数据的方法
    42. //传进段名和键名获取内容
    43. //以后Read("段名","键名") 返回字符串类型
    44. public string Read(string sectionName,string keyName)
    45. {
    46. return ReadData(sectionName, keyName,this.FileName);
    47. }
    48. //如果读取数据 没读取到 给赋一个初值
    49. //Read("Secotion",A,"1000") 最终结果:hello world
    50. //Read("Secotion",C,"1000") 最终结果:1000
    51. public string Read(string sectionName, string keyName,string defaultValue)
    52. {
    53. string v = Read(sectionName, keyName);
    54. if (string.IsNullOrEmpty(v))
    55. {
    56. return defaultValue;
    57. }
    58. return v;
    59. }
    60. //读取的时候 返回一个整型的数据值
    61. //Read("Secotion",C,1000) 最终结果:1000
    62. //Read("Secotion",A,1000) 最终结果:1000
    63. public int Read(string s1, string k1, int d1)
    64. {
    65. string v = Read(s1, k1);
    66. if (int.TryParse(v,out int value))
    67. {
    68. return value;
    69. }
    70. else
    71. {
    72. return d1;
    73. }
    74. }
    75. public bool Read(string s1, string k1, bool d1)
    76. {
    77. string v = Read(s1, k1);
    78. if (bool.TryParse(v,out bool value))
    79. {
    80. return value;
    81. }
    82. else
    83. {
    84. //不能转成bool
    85. if (v=="1"||v=="OK"||v=="ON"||v=="YES")
    86. {
    87. return true;
    88. }
    89. else if(v=="0"||v=="NO"||v=="OFF"||v.ToUpper()=="OFF")
    90. {
    91. //如果值以上几种请求 值为false
    92. return false;
    93. }
    94. else
    95. {
    96. return d1;
    97. }
    98. }
    99. }
    100. //ini值是double类型
    101. public double Read(string s1, string k1, double d1)
    102. {
    103. string v = Read(s1, k1);
    104. if (double.TryParse(v, out double value))
    105. {
    106. return value;
    107. }
    108. else
    109. {
    110. return d1;
    111. }
    112. }
    113. //封装写入数据的方法
    114. //先定义一个静态写入方法
    115. public static int WriteData(string s1,string k1,string v,string file)
    116. {
    117. return WritePrivateProfileString(s1,k1,v,file);
    118. }
    119. //在封装Write方法传递 传进段名 键名 值是字符串
    120. public int Write(string s1,string k1,string v1)
    121. {
    122. return WriteData(s1, k1, v1, this.FileName);
    123. }
    124. //在封装Write方法传递 传进段名 键名 值是整型
    125. public int Write(string s1, string k1, int v1)
    126. {
    127. return WriteData(s1, k1, v1.ToString(), this.FileName);
    128. }
    129. //在封装Write方法传递 传进段名 键名 值是bool
    130. public int Write(string s1, string k1, bool v1)
    131. {
    132. return WriteData(s1, k1, v1?"1":"0", this.FileName);
    133. }
    134. //在封装Write方法传递 传进段名 键名 值是时间格式
    135. public int Write(string s1, string k1, DateTime v1)
    136. {
    137. return WriteData(s1, k1, v1.ToString("yyyy-MM-dd HH-mm:ss"), this.FileName);
    138. }
    139. }
    140. }

    操作配置文件保存方式 代码

    1. namespace 操作配置文件保存方式
    2. {
    3. public partial class Form1 : Form
    4. {
    5. public Form1()
    6. {
    7. InitializeComponent();
    8. //1 创建一个全局的ini文件操作对象
    9. //@"Setting.ini" 不代表debug路径下
    10. //Application.StartupPath:到exe这个文件路径 就是debug文件下
    11. //Combine连接, debug/File
    12. string dirPath = Path.Combine(Application.StartupPath, "File");
    13. //filePath ; debug/File/Setting.ini
    14. string filePath = Path.Combine(dirPath, "Setting.ini");
    15. ini = new IniHelper(filePath);
    16. }
    17. IniHelper ini;
    18. private void button1_Click(object sender, EventArgs e)
    19. {
    20. //1 使用带俩个参数 段名 键名的Read方法
    21. var s1 = ini.Read("Secotion", "A");
    22. //2 使用三个参数 段名 键名 默认值 返回值字符串
    23. var s2 = ini.Read("Secotion", "A","你好");
    24. //3 使用三个参数 段名 键名 默认值 返回值整型
    25. var s3 = ini.Read("Secotion", "B", 1000);
    26. //4 使用三个参数 段名 键名 默认值 返回值bool
    27. var s4 = ini.Read("Secotion", "B", false);
    28. //5 使用三个参数 段名 键名 默认值 返回值double
    29. var s5= ini.Read("Secotion", "C1", 10.9);
    30. //MessageBox.Show(s5+"");
    31. //使用写入数据的方法
    32. ini.Write("Serialport", "botelv", 4800);
    33. ini.Write("Secotion1", "D", "hello");
    34. ini.Write("Secotion1", "E", DateTime.Now);
    35. ini.Write("Secotion1", "F",true);
    36. }
    37. }
    38. }

  • 相关阅读:
    【freeRTOS】操作系统之五.-内存管理
    Java二分查找
    【学习笔记】「2020-2021 集训队作业」Communication Network
    Python基础语法(二)—— 条件语句(if)+循环语句(for+while)
    HTML静态网页作业——澳门英文旅游网站设计与实现HTML+CSS+JavaScript
    设计模式笔记 ——1(结构体的私有属性)
    Android开发基础——Activity基本用法
    JAVA面试之容器
    java 数字计算不能使用float
    好奇心驱使下试验了 chatGPT 的 js 代码的能力
  • 原文地址:https://blog.csdn.net/weixin_73535261/article/details/140110334