最近用了下周立功的CANET,用了两个CANET没有在一路CAN总线上,两路CAN总线上都挂了设备。写这个的目的是要记下如何控制两个CANET设备。
CANET有
1,IP:192.168.0.178
2,端口号:4001
3,设备索引:自己定
4,第几路CAN:不用改
启动CAN:
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, 1, 0);//第一位是type,CANET就是17,不用改。第二位是设备索引,自己定,添几都可以。第三位是第几路CAN,不用改。设备索引在开启的时候添的几,在接收和下发命令时就要添几。这个是用来区分多个CAN设备的唯一标识。
if (i == 1)
{
string CANip = ConfigurationManager.AppSettings["canip"].ToString();
Int32 ll = 4001;//设备端口号,每个CANET的这个端口号 不能一样。
i = VCI_SetReference(17, 1, 0, 0, CANip);//第一位是type,CANET就是17,不用改。第二位是设备索引,自己定,添几都可以。第三位是第几路CAN,不用改。
i = VCI_SetReference(17, 1, 0, 1, out ll);//第一位是type,CANET就是17,不用改。第二位是设备索引,自己定,添几都可以。第三位是第几路CAN,不用改。
i = VCI_StartCAN(17, 1, 0);
if (i == 1)//开启
{
//MessageBox.Show("start ok");
}
else
{
//MessageBox.Show("start error");
isRes = 1;
rc = new RestartCAN();
}
}
else
{
//MessageBox.Show("ERROR");
}
}
}
接收CAN上的数据:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Configuration;
using System.Threading;
using System.IO;
public struct VCI_CAN_OBJ_64
{
public UInt32 ID;
public UInt32 TimeStamp;
public byte TimeFlag;
public byte SendType;
public byte RemoteFlag;//是否是远程帧
public byte Ex