CAN功能移植兼容
This commit is contained in:
@@ -34,6 +34,11 @@ namespace ZLGUSBCANFD
|
||||
private readonly uint _deviceIndex; // 设备索引
|
||||
private readonly int _maxChannels; // 动态通道数
|
||||
|
||||
// 通道波特率与终端电阻配置(构造时传入,所有通道共用)
|
||||
private readonly string _abitBaud;
|
||||
private readonly string _dbitBaud;
|
||||
private readonly bool _enableTerminalResistance;
|
||||
|
||||
/// <summary>
|
||||
/// 当前 CAN 卡专属的 DBC 解析器,按通道隔离报文数据库。
|
||||
/// </summary>
|
||||
@@ -45,11 +50,15 @@ namespace ZLGUSBCANFD
|
||||
/// </summary>
|
||||
public event Action<uint, ZDBC.DBCMessage>? OnDbcMessageDecoded;
|
||||
|
||||
public ZLGCANFD(uint deviceType = 76, uint deviceIndex = 0, int maxChannels = 4)
|
||||
public ZLGCANFD(uint deviceType = 76, uint deviceIndex = 0, int maxChannels = 4,
|
||||
string abitBaud = "500000", string dbitBaud = "2000000", bool enableTerminalResistance = true)
|
||||
{
|
||||
_deviceType = deviceType;
|
||||
_deviceIndex = deviceIndex;
|
||||
_maxChannels = maxChannels;
|
||||
_abitBaud = abitBaud;
|
||||
_dbitBaud = dbitBaud;
|
||||
_enableTerminalResistance = enableTerminalResistance;
|
||||
|
||||
// 初始化通道相关状态数组
|
||||
_channelHandles = new IntPtr[_maxChannels];
|
||||
@@ -80,9 +89,9 @@ namespace ZLGUSBCANFD
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 针对特定通道进行参数初始化并启动
|
||||
/// 针对特定通道进行参数初始化并启动(使用构造时传入的波特率与终端电阻配置)
|
||||
/// </summary>
|
||||
public virtual bool 初始化并启动通道(uint 通道号, string abitBaud = "500000", string dbitBaud = "2000000", bool 开启终端电阻 = true)
|
||||
public virtual bool 初始化并启动通道(uint 通道号)
|
||||
{
|
||||
if (_deviceHandle == IntPtr.Zero) throw new InvalidOperationException("请先调用 '打开设备()' 才能初始化通道。");
|
||||
if (通道号 >= _maxChannels) return false;
|
||||
@@ -96,11 +105,11 @@ namespace ZLGUSBCANFD
|
||||
}
|
||||
|
||||
// 1. 设置该通道专属的仲裁域与数据域波特率
|
||||
if (ZLGCAN.ZCAN_SetValue(_deviceHandle, $"{通道号}/canfd_abit_baud_rate", abitBaud) != 1) return false;
|
||||
if (ZLGCAN.ZCAN_SetValue(_deviceHandle, $"{通道号}/canfd_dbit_baud_rate", dbitBaud) != 1) return false;
|
||||
if (ZLGCAN.ZCAN_SetValue(_deviceHandle, $"{通道号}/canfd_abit_baud_rate", _abitBaud) != 1) return false;
|
||||
if (ZLGCAN.ZCAN_SetValue(_deviceHandle, $"{通道号}/canfd_dbit_baud_rate", _dbitBaud) != 1) return false;
|
||||
|
||||
// 2. 设置该通道专属内部终端电阻状态
|
||||
string resistanceStr = 开启终端电阻 ? "1" : "0";
|
||||
string resistanceStr = _enableTerminalResistance ? "1" : "0";
|
||||
if (ZLGCAN.ZCAN_SetValue(_deviceHandle, $"{通道号}/initenal_resistance", resistanceStr) != 1) return false;
|
||||
|
||||
// 3. 规范配置通道结构体
|
||||
@@ -179,7 +188,8 @@ namespace ZLGUSBCANFD
|
||||
try
|
||||
{
|
||||
if (_isDbcLoadedArray[通道号]) return true;
|
||||
|
||||
//加载前先卸载
|
||||
释放通道DBC(通道号);
|
||||
uint chDbcHandle = ZDBC.ZDBC_Init();
|
||||
if (chDbcHandle == 0) return false;
|
||||
|
||||
@@ -217,6 +227,7 @@ namespace ZLGUSBCANFD
|
||||
ZDBC.ZDBC_Release(_dbcHandles[通道号]);
|
||||
_dbcHandles[通道号] = 0;
|
||||
_isDbcLoadedArray[通道号] = false;
|
||||
DBCParser.MsgDatabase[(int)通道号].Clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -440,7 +451,7 @@ namespace ZLGUSBCANFD
|
||||
ZLGCAN.can_frame canFrame = (ZLGCAN.can_frame)Marshal.PtrToStructure(ptrCanFrame, typeof(ZLGCAN.can_frame));
|
||||
canFrame.__pad |= 0x20;
|
||||
|
||||
ZLGCAN.ZCAN_Transmit_Data txData = new ZLGCAN.ZCAN_Transmit_Data { frame = canFrame, transmit_type = 0 };
|
||||
ZLGCAN.ZCAN_Transmit_Data txData = new ZLGCAN.ZCAN_Transmit_Data { frame = canFrame, transmit_type = 2 };
|
||||
IntPtr pTx = Marshal.AllocHGlobal(Marshal.SizeOf(txData));
|
||||
try
|
||||
{
|
||||
@@ -467,7 +478,7 @@ namespace ZLGUSBCANFD
|
||||
ZLGCAN.canfd_frame canfdFrame = (ZLGCAN.canfd_frame)Marshal.PtrToStructure(ptrCanFDFrame, typeof(ZLGCAN.canfd_frame));
|
||||
canfdFrame.flags |= 0x20;
|
||||
|
||||
ZLGCAN.ZCAN_TransmitFD_Data txFdData = new ZLGCAN.ZCAN_TransmitFD_Data { frame = canfdFrame, transmit_type = 0 };
|
||||
ZLGCAN.ZCAN_TransmitFD_Data txFdData = new ZLGCAN.ZCAN_TransmitFD_Data { frame = canfdFrame, transmit_type = 2 };
|
||||
IntPtr pTxFd = Marshal.AllocHGlobal(Marshal.SizeOf(txFdData));
|
||||
try
|
||||
{
|
||||
@@ -617,7 +628,7 @@ namespace ZLGUSBCANFD
|
||||
};
|
||||
Array.Copy(原始数据, 0, fdFrame.data, 0, Math.Min(原始数据.Length, 64));
|
||||
|
||||
ZLGCAN.ZCAN_TransmitFD_Data txFdData = new ZLGCAN.ZCAN_TransmitFD_Data { frame = fdFrame, transmit_type = 0 };
|
||||
ZLGCAN.ZCAN_TransmitFD_Data txFdData = new ZLGCAN.ZCAN_TransmitFD_Data { frame = fdFrame, transmit_type = 2 };
|
||||
IntPtr pTxFd = Marshal.AllocHGlobal(Marshal.SizeOf(txFdData));
|
||||
try
|
||||
{
|
||||
@@ -637,7 +648,7 @@ namespace ZLGUSBCANFD
|
||||
};
|
||||
Array.Copy(原始数据, 0, standardFrame.data, 0, Math.Min(原始数据.Length, 8));
|
||||
|
||||
ZLGCAN.ZCAN_Transmit_Data txData = new ZLGCAN.ZCAN_Transmit_Data { frame = standardFrame, transmit_type = 0 };
|
||||
ZLGCAN.ZCAN_Transmit_Data txData = new ZLGCAN.ZCAN_Transmit_Data { frame = standardFrame, transmit_type = 2 };
|
||||
IntPtr pTx = Marshal.AllocHGlobal(Marshal.SizeOf(txData));
|
||||
try
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user