接上回串口识别和保存部分

# 串口配置项

# 可行性验证

先完成串口配置的保存,以便在配置文件中修改串口信息

首先在 Config.cs 中添加相应项

1
2
//硬件串口号
public Dictionary<string,string> DEVICE_COM = new Dictionary<string, string>();
1
2
3
4
5
6
7
public class Settings
{
...;
//串口号
public Dictionary<string, string> DEVICE_COM;
...;
}
1
2
3
4
5
6
7
8
9
10
//读取配置文件 加载各类参数
public void load(string file = "./config.toml")
{
if (file.Length > 0 && File.Exists(file))
{
...;
DEVICE_COM = settings.DEVICE_COM;
...;
}
}

在插件 PluginSerialDevices 中添加 ConfigHelper 类,用于实现接入配置加载功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class ConfigHelper
{
...;
public Dictionary<string, string> COM;

//获取对应对象
private object getObj(object obj,string name)
{
object o = null;
bool success = false;
try
{
o = PluginInterface.PluginToolkits.GetValue(obj, name);
if (o != null)
success = true;
}
catch
{
Console.WriteLine($"Cannot find keyword:{name}");
return null;
}
finally{}

if (success)
return o;
else
return null;
}

//获取配置中的串口号
private bool getCfg(object mainWnd)
{
object cfg = getObj(mainWnd, "cfg");
if(cfg != null)
{
COM = (Dictionary<string, string>) getObj(cfg, "DEVICE_COM");
return true;
}
return false;

}



public ConfigHelper(object mainWnd,string name)
{
if (getCfg(mainWnd))
{
//用于测试是否成功加载到配置
if(!COM.ContainsKey(name))
COM.Add(name,"testCOM");

}

}

在 Alarm 和 AutoGain 实现的类中,添加读取配置

1
ConfigHelper cfg;

并且在相应 OnLoad 事件中进行初始化

1
cfg = new ConfigHelper(MainWnd, "Alarm");
1
cfg = new ConfigHelper(MainWnd, "AutoGain");

这样就能让外部插件成功获取到配置信息,并且进行修改

编译该插件,并替换 plugins 目录中对应的文件,调试执行,查看 debug 目录下的 config.tmol,发现成功写入了相应配置项

image-20221109161531137

# 配置项接入

现在将对应功能实现的串口号接入配置项,使其能够使用配置文件中的串口号进行连接

在 AutoGain 类中添加相应内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void Init(Control control = null)
{

MainWnd = control;
cfg = new ConfigHelper(MainWnd, "AutoGain");

camera = new CameraController();
//加载配置中的串口号
light = new LightController(cfg.COM["AutoGain"]);


Attributes = new Dictionary<string, object>();

...;
}

设备 camera 由于是固定的虚拟串口号 COM13 因此不做修改保持默认即可。

设置断点,启动调试,可以看到

image-20221109171533332

确实已经读取到了相应的配置项

# 串口状态检测

修改 ConfigHelper 类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
class ConfigHelper
{
string Name;
public ConfigHelper(object mainWnd,string name)
{
Name = name;
if (getCfg(mainWnd))
{
if (!COM.ContainsKey(name))
setCOM(name);
}
}

public bool COM_INFO()
{
string msg = $" 设备 {Name} 未配置的串口信息\n";
msg += "请选择对应的串口设备,并修改配置文件对应配置项\n";
msg += getPortDeviceName();
MessageBox.Show(msg);
return false;
}

public bool setCOM(string name)
{
//COM.Add(name,)
COM_INFO();
COM.Add(name,"COMx");
return false;
}

private string getPortDeviceName()
{
List<string> devices = new List<string>();

using (ManagementObjectSearcher searcher = new ManagementObjectSearcher
("select * from Win32_PnPEntity where Name like '%(COM%'"))
{
var hardInfos = searcher.Get();

foreach (var hardInfo in hardInfos)
{
if (hardInfo.Properties["Name"].Value != null)
{
string deviceName = hardInfo.Properties["Name"].Value.ToString();
Console.WriteLine(deviceName);
devices.Add(deviceName);
}
}
}

if (devices.Count > 0)
{
string DeviceList = "";
foreach (string s in devices)
{
DeviceList += s;
DeviceList += "\n";
}
return DeviceList;
}
else
return "Cannot find COM devices!";

}
}
}

删除对应的配置项再进行测试,会提示现在存在的串口信息

image-20221109174227016

然后自动生成了对应的配置项

image-20221109172322404

image-20221109172357054

现在可以在配置文件中修改相关功能对应的串口号了