基于C#的CAN总线通信开发指南
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);