我正在使用 MCP2515(CAN 收发器)开展一个项目,该芯片的一个特点是我可以通过应用规则(掩码)来过滤 ID,只让特定范围的数据通过过滤器。我最多可以有 6 个不同的过滤器。在我正在编码的应用程序中,我解析了一个 DBC 文件以选择我想要接收的信号。如果我有 6 个或更少的信号,我可以为这些信号中的每一个制定“传递规则”,但如果我有 6 个以上的信号,我需要创建规则来包含我需要的所有 ID。理想情况下,每个组都将包含尽可能小的数据范围。我希望它自动计算,所以我需要创建一种算法来重新组合我的 ID。
例如,如果我选择了以下 ID:32、154、157、160、354、363、680、682、841、845、871、932、936、940
我的数据组将是 [32], [154, 157, 160], [354, 363], [680, 682], [841, 845, 871], [932, 936, 940]。
这是我现在拥有的代码,但它无法处理范围的结尾(在上述情况下:32 和 940)。
private void getMasks()
{
List<List<uint>> fields = new List<List<uint>>();
uint spectrum = 0;
uint chunkSize = 0;
IDs.Sort();
spectrum = IDs.Last() - IDs.First();
//Gets the sixth of my whole data range for a first grouping
chunkSize = (uint)Math.Ceiling(((double)spectrum / 6));
//Regroups data in the 6 ranges
for(int i = 0; i < 6; i++)
{
fields.Add(new List<uint>());
foreach (uint id in IDs)
{
if (id >= ((i * chunkSize) + IDs.First()) && id < (((i + 1) * chunkSize) - 1) + IDs.First())
fields[i].Add(id);
}
}
//If a range doesn't have data, removes it
for (int j = 0; j < fields.Count; j++)
if (fields[j].Count == 0)
{
fields.RemoveAt(j);
j--;
}
有人能给我一些关于如何在尽可能小的范围内重新组合数据的提示或示例吗?
catspeake
慕村225694
相关分类