由于程序中需要根据DBC文件来解析通讯数据,一个一个将DBC里的信号输入程序太麻烦了,且不同的设备DBC文件格式相同,但内容不同,为了程序方便解析同的设备的数据,下面以解析文本的形式将DBC文件自动加载至程序中;
public class TestDeviceVModel
{
string NS_;
string Memo_;
bool IsNs = false;
object CM_ = null;
private DeviceModel ImpDBCFile()
{
List<string> _dbc = new List<string>();
using (StreamReader _sr = new StreamReader(YiouConvert.GetOpenFilePath(), Encoding.Default))
{
string line;
while ((line = _sr.ReadLine()) != null)
{
line = line.TrimStart().Replace(" ", " "); ;
if (!string.IsNullOrWhiteSpace(line) && !line.StartsWith("//"))// 去掉空行和注释行
{
_dbc.Add(line);
}
}
_sr.Close();
}
//DeviceModel DevInfoCache = DeviceList.ToList().Find(n=>n.Name=="")??new DeviceModel();
DeviceModel DevInfoCache = new DeviceModel();
DevInfoCache.MessageList = new ObservableCollection<DevMessage>();
_dbc.ForEach(item =>
{
string[] info = item.Split(' ');
if (info.Length <= 0) { return; }
DevMessage _dev;
DevChannel _chan;
switch (info[0])
{
case "VERSION":
//GetDBCVersion(info);
break;
case "NS_":
CM_ = null;
IsNs = true;
NS_ = string.Empty;
break;
case "BS_:":
//GetNetWorkBAUD(info);
break;
case "BU_:":
//GetNetWorkNode(info);
break;
case "BO_":
_dev = GetMegInfoCache(info);
if (_dev != null)
DevInfoCache.MessageList.Add(_dev);
break;
case "SG_":
if (DevInfoCache.MessageList != null && DevInfoCache.MessageList.Count > 0)
{
_chan = GetDevChannel(info);
if (_chan != null)
{
_chan.CANID = DevInfoCache.MessageList[DevInfoCache.MessageList.Count - 1].CANID;
DevInfoCache.MessageList[DevInfoCache.MessageList.Count - 1].ChannelList.Add(_chan);
}
}
break;
case "CM_":
GetMemoContent(info, DevInfoCache);
break;
case "BA_DEF_":
break;
case "BA_DEF_DEF_":
break;
case "BA_":
break;
case "VAL_":
GetOption(info, DevInfoCache);
//_id = info.Length < 2 || string.IsNullOrWhiteSpace(info[1]) ? 0 : int.Parse((Convert.ToUInt32(info[1]) & 0x7FFFFFFF).ToString());
//_chan = DevInfoCache.MessageList.ToList().Find(n => n.MessageID == _id).ChannelList.ToList().Find(n => n.ChannelName == info[2]);
//for (int i = 3; i < info.Length; i++)
//{
// Memo_ += info[i];
//}
break;
default:
GetEnterContent(info, item);
break;
}
});
//NS_.Substring(0, NS_.Length - 1);
return DevInfoCache;
}
/// <summary>
/// 获取DBC文件版本号
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
private string GetDBCVersion(string[] info)
{
string _str = string.Empty;
if (info.Lengt