CAN(Control Area NetWork)通信主要用于汽车行业,是Bosch公司开发用于监测,控制汽车。
它是一种汽车总线,成本相对较低,通信介质采用双绞线,采用多主通信的方式进行节点访问。
采用的是短帧结构,有效的字节数是8个,可让汽车实时响应。
可通过CAN收发器让电脑通过USB接口接入CAN网络。
C#实现数据的读写
1、将Kvaser.CanLib.dll引入项目,canlib32.dll放入根目录
2、写入操作
// 初始化驱动
Canlib.canInitializeLibrary();
// 打开信道
var handle = Canlib.canOpenChannel(1, Canlib.canOPEN_ACCEPT_VIRTUAL);
Canlib.canSetBitrate(handle, Canlib.canBITRATE_500K);
// 打开总线
Canlib.canBusOn(handle);
byte[] msg = new byte[]
{
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08
};
// 发送数据,第一个参数是信道句柄,几乎每个操作都会用到,第二个参数是操作编号,用来区分不同的数据编号
// 第三个参数是写入的数据,第四个参数是数据长度,第五个参数是消息标识:1-远程请求;
// 2-11位的标准帧,3-29位的扩展帧
var status = Canlib.canWrite(handle, 10, msg, 8, 2);
if (status == Canlib.canStatus.canOK)
{
this.textBox1.Text = this.textBox1.Text + "写入成功" + Environment.NewLine;
}
else
{
this.textBox1.Text = this.textBox1.Text + status.Description() + Environment.NewLine;
}
// 释放资源
Canlib.canBusOff(handle);
Canlib.canClose(handle);
3、读取操作
// 初始化驱动
Canlib.canInitializeLibrary();
// 打开信道
var handle = Canlib.canOpenChannel(1, Canlib.canOPEN_ACCEPT_VIRTUAL);
Canlib.canSetBitrate(handle, Canlib.canBITRATE_500K);
// 打开总线
Canlib.canBusOn(handle);
byte[] msg = new byte[8];
CancellationTokenSource cts = new CancellationTokenSource();
Task.Run(async () => {
while (cts.IsCancellationRequested == false)
{
await Task.Delay(1000, cts.Token);
// 读取方法的参数和写入的几乎完全一致
Canlib.canReadSpecific(handle, 10, msg, out int dlc, out int flag, out long time);
this.Invoke(new Action(() =>
{
this.textBox1.Text = string.Join(",", msg) + Environment.NewLine + this.textBox1.Text;
}));
}
}, cts.Token);