基于C#的CAN总线通信开发指南

发布于:2025-05-09 ⋅ 阅读:(14) ⋅ 点赞:(0)

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);


网站公告

今日签到

点亮在社区的每一天
去签到