之前写过一个关于CANET的文章,现在有所改进
CANET-200T有两个CAN的端口,用程序分别给这两个口发送和接受数据;启动这两个端口,要把两个端口当作两个设备来启动。
#启动CANET-200T的第一个端口
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Configuration;
namespace BroadcastCtrl
{
public class CANstart
{
[DllImport("ControlCAN")]
private static extern Int32 VCI_OpenDevice(Int32 DevType, Int32 DevIndex, Int32 Reserved);
[DllImport("ControlCAN")]
private static extern Int32 VCI_StartCAN(Int32 DevType, Int32 DevIndex, Int32 CANIndex);
[DllImport("ControlCAN")]
private static extern Int32 VCI_SetReference(Int32 DevType, Int32 DevIndex, Int32 CANIndex, Int32 RefType, [MarshalAs(UnmanagedType.LPStr)]string pData);//[MarshalAs(UnmanagedType.LPStr)]string IntPtr
[DllImport("ControlCAN")]
private static extern Int32 VCI_SetReference(Int32 DevType, Int32 DevIndex, Int32 CANIndex, Int32 RefType, out Int32 pData);
[DllImport("ControlCAN")]
private static extern Int32 VCI_Receive(Int32 DevType, Int32 DevIndex, Int32 CANIndex, ref VCI_CAN_OBJ pReceive, Int32 Len, int WaitTime);
public RestartCAN rc;
public int isRes = 0;
public CANstart()
{
int i = VCI_OpenDevice(17, 0, 0);//第二个参数为设备索引号 第一个设备设置为0
if (i == 1)
{
string CANip = ConfigurationManager.AppSettings["canip"].ToString();
Int32 ll = 4001;//第一个端口号
i = VCI_SetReference(17, 0, 0, 0, CANip);
i = VCI_SetReference(17, 0, 0, 1, out ll);
i = VCI_StartCAN(17, 0, 0);
if (i == 1)//开启
{
//MessageBox.Show("start ok");
}
else
{
//MessageBox.Show("start error");
isRes = 1;
rc = new RestartCAN();
}
}
else
{
//MessageBox.Show("ERROR");
}
}
}
}
#启动第二个端口
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Configuration;
namespace BroadcastCtrl
{
public class CANstart2
{
[DllImport("ControlCAN")]
private static extern Int32 VCI_OpenDevice(Int32 DevType, Int32 DevIndex, Int32 Reserved);
[DllImport("ControlCAN")]
private static extern Int32 VCI_StartCAN(Int32 DevType, Int32 DevIndex, Int32 CANIndex);
[DllImport("ControlCAN")]
private static extern Int32 VCI_SetReference(Int32 DevType, Int32 DevIndex, Int32 CANIndex, Int32 RefType, [MarshalAs(UnmanagedType.LPStr)]string pData);//[MarshalAs(UnmanagedType.LPStr)]string IntPtr
[DllImport("ControlCAN")]
private static extern Int32 VCI_SetReference(Int32 DevType, Int32 DevIndex, Int32 CANIndex, Int32 RefType, out Int32 pData);
[DllImport("ControlCAN")]
private static extern Int32 VCI_Receive(Int32 DevType, Int32 DevIndex, Int32 CANIndex, ref VCI_CAN_OBJ pReceive, Int32 Len, int WaitTime);
public RestartCAN2 rc2;
public int isRes = 0;
public CANstart2()
{
int i = VCI_OpenDevice(17, 1, 0);;//第二个参数为设备索引号 第二个设备设置为1
if (i == 1)
{
string CANip = ConfigurationManager.AppSettings["canip_2"].ToString();
Int32 ll = 4002;//第二个端口号
i = VCI_SetReference(17, 1, 0, 0, CANip);
i = VCI_SetReference(17, 1, 0, 1, out ll);
i = VCI_StartCAN(17, 1, 0);
if (i == 1)//开启
{
//MessageBox.Show("start ok");
}
else
{
//MessageBox.Show("start error");
isRes = 1;
rc2 = new RestartCAN2();
}
}
else
{
//MessageBox.Show("ERROR");
}
}
}
}
#上述可以将CANET-200T的俩个端口都打开
接受和发送数据就和之前写的一样。用设备索引号来区分是哪个端口。