0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【Z站推荐】CAN接口卡如何解决上位机系统的调度延时问题?

ZLG致远电子 2022-07-24 17:02 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

上位机调用CAN接口卡发送数据时,受上位机系统调度耗时的影响,实际CAN卡发送时会有时间上的误差,是否有CAN卡可以将发送定时放到设备中来完成,从而规避掉上位机的调度影响呢?本文将为大家具体分析。使用CAN接口卡是CAN通讯领域无法避开的话题,它提供各种的接口类型,兼容多种上位机系统,简单易用的二次开发接口函数库。此外,windows平台还提供了专业的应用层协议库(DBC解析库、UDS库等),比起用ARM直接开发CAN(FD),用户使用接口卡二次开发,可以直接调用高层协议函数库,可以极大的节省应用层协议栈的开发成本。用户只需关注自己的业务逻辑即可,大大的缩短项目开发周期。如此方便的用法也产生了一个问题,接口卡必须依赖于上位机的调用,不管windows还是linux系统,非实时系统就涉及到一个延时问题——系统调度的延时例如当上位机执行到transmit发送函数,到系统执行这个动作,驱动将buffer下发给CAN接口卡的时间。系统调度时间是不可控的,取决于多方因素:程序开发的语言,电脑的性能,CPU当前的占用率等,一般都为毫秒级误差。因此,当用户需要软件定时来发送报文时,无法保证很低的时间误差。

是否有办法规避上位机调度的延时?

方法是有的。USBCANFD提供了两种方法,一定程度上规避上位机调度的时延问题:

硬件定时发送;

队列发送。

90c06842-0a15-11ed-9ade-dac502259ad0.png


90df7872-0a15-11ed-9ade-dac502259ad0.jpg 硬件定时发送

USBCANFD 支持每通道最大 100条定时发送列表,只需将待发送数据及周期设置到设备并使能,设备将自动进行发送。相比于 PC 端的发送,定时发送精度高,周期准。在设备进行定时发送任务时,PC 端仍可调用数据发送接口进行数据发送。软件实现方法,在ZCAN_StartCAN之后,继续通过setvalue方式将定时发送结构体下载到设备中:

ZCAN_AUTO_TRANSMIT_OBJ auto_can; //从CAN定时发送结构体生成实例ZCANFD_AUTO_TRANSMIT_OBJ auto_canfd; //从CANFD定时发送结构体生成实例memset(&auto_can, 0, sizeof(auto_can));auto_can.index = 0; // 定时列表索引0auto_can.enable = 1; // 使能此索引,每条可单独设置auto_can.interval = 100; // 定时发送间隔100msget_can_frame(auto_can.obj, 0); // 构造CAN报文prop->SetValue("1/auto_send", (const char*)&auto_can); // 设置定时发送memset(&auto_can, 0, sizeof(auto_can));auto_can.index = 1; // 定时列表索引1auto_can.enable = 1; // 使能此索引,每条可单独设置auto_can.interval = 200; // 定时发送间隔200msget_can_frame(auto_can.obj, 1); // 构造CAN报文prop->SetValue("1/auto_send", (const char*)&auto_can); // 设置定时发送memset(&auto_canfd, 0, sizeof(auto_canfd));auto_canfd.index = 2; // 定时列表索引2auto_canfd.enable = 1; // 使能此索引,每条可单独设置auto_canfd.interval = 500; // 定时发送间隔500msget_canfd_frame(auto_canfd.obj, 2); // 构造CANFD报文prop->SetValue("1/auto_send_canfd", (const char*)&auto_canfd); // 设置定时发送prop->SetValue("1/apply_auto_send", "0"); // 使能定时发送Sleep(5000); // 等待发送5sprop->SetValue("1/clear_auto_send", "0"); // 清除定时发送

优点:1.周期稳定,精度100us;2.可修改报文内容随时覆盖;3.可根据需求单独对某条定时报文进行禁用操作。缺点:1.数据不是自动变化的,如涉及到内容变化,需要再次设置定时;2.不适用于非周期性的报文。


90df7872-0a15-11ed-9ade-dac502259ad0.jpg 队列发送

通过队列发送,用户可以提前准备好多帧报文,设定报文之间的间隔,将准备好的报文发送给设备,设备按照预定义的帧间隔进行精准发送,通过此方式可提高发送帧之间的帧间隔精度。与定时发送相比,队列发送每帧只发送一次,需由用户不断准备报文并批量发送到设备。USBCANFD-200U先通过SetValue将设备的发送模式切换成队列发送模式。队列发送缓存大小为100帧,队列发送过程中,可以通过GetValue查询当前队列缓存的剩余空间。队列发送有两种方法实现:

一种是合并发送ZCAN_TransmitData——对应发送结构体ZCANDataObj;

另一种是单通道发送ZCAN_Transmit和ZCAN_TransmitFD——对应发送结构体ZCAN_Transmit_Data和ZCAN_TransmitFD_Data。

两者都是发送结构体中使能队列发送标志位,并且填入队列发送报文间隔,再通过对应发送函数,发给设备合并发送ZCAN_TranmitData的代码实现:

Prop->Setvalue(“0/set_send_mode”, “1”); //USBCANFD需要切换发送模式,CANFDNET无需此步骤…void get_can_frame_queue(ZCANDataObj& data, int ch, canid_t id, bool is_fd, UINT delay){memset(&data, 0, sizeof(data)); //初始化data结构体data.dataType = ZCAN_DT_ZCAN_CAN_CANFD_DATA;data.chnl = ch; //通道号ZCANCANFDData & can_data = data.data.zcanCANFDData;can_data.frame.can_id = MAKE_CAN_ID(id, 0, 0, 0); // CAN ID + STD/EXT + DATA/RMTcan_data.frame.len = is_fd ? 64 : 8; // 数据长度 8/64can_data.flag.unionVal.transmitType = 0; // 正常发送can_data.flag.unionVal.txEchoRequest = 1; // 设置发送回显can_data.flag.unionVal.frameType = is_fd ? 1 : 0; // CAN or CANFDcan_data.flag.unionVal.txDelay = ZCAN_TX_DELAY_UNIT_MS; // 队列延时单位毫秒can_data.timeStamp = delay; // 队列延时时间,最大值 65535for (int i = 0; i < can_data.frame.len; ++i) {                 // 填充 CAN 报文 DATAcan_data.frame.data[i] = i;}…Ret = ZCAN.TransmitData(device_handle, data ,len);

第二种方法ZCAN_Transmit的代码实现:

Prop->Setvalue(“0/set_send_mode”, “1”); //USBCANFD需要切换发送模式,CANFDNET无需此步骤…ZCAN_Transmit_Data can_data[10]={};ZCAN_TransmitFD_Data canfd_data[10]={};memset(& can_data, 0, sizeof(can_data)); //初始化data结构体memset(& canfd_data, 0, sizeof(canfd_data)); //初始化data结构体…can_data[0].frame.can_id =0x100;can_data[0].frame.__pad =0x80; //使能CAN帧队列发送can_data[0].frame.__res0 =0x64; // 低位,设置100mscan_data[0].frame.__res1 =0x00; // 高位…canfd_data[0].frame.can_id =0x200;canfd_data[0].frame.flags=0x80; //使能非加速CANFD队列发送,0x81使能加速CANFD队列发送canfd_data[0].frame.__res0 =0x64; // 低位,设置100mscanfd_data[0].frame.__res1 =0x00; // 高位…ret = ZCAN.Transmit(channel_handle, can_data, 10);ret_fd = ZCAN.TransmitFD(channel_handle, canfd_data, 10);

队列发送的优缺点:

  • 优点:定时间隔准确,最小精度为100us;
  • 缺点:设备分配的缓存大小有限,实际使用中需要结合getvalue去查缓存剩余空间,避免发送帧丢失。

以上两种方法分别适用不同场景,根据实际应用需求,灵活使用,可以很大程度规避上位机调度带来的时延问题,对用户的通讯起到更稳定和精准的控制。

【版权声明】本文为ZLG开发者社区用户原创内容,未经授权不得转载。欢迎更多用户到社区交流互动、创作博文,一经采用,可获得百元京东E卡。

地址:https://developer.zlg.cn(长按复制到PC端打开)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    9443

    浏览量

    156108
  • CAN
    CAN
    +关注

    关注

    58

    文章

    3010

    浏览量

    471391
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    双路PCIe-CAN(FD)接口卡 介绍#三格电子

    接口
    三格电子科技
    发布于 :2025年10月27日 10:01:24

    PCIe接口卡设计原理图:124-基于XC7Z015的PCIe低速扩展底板

    板卡由SoC XC7Z015芯片来完成主控及数字信号处理,XC7Z015内部集成了两个ARM Cortex-A9核和一个Artix 7的FPGA,通过PL端FPGA扩展PMC接口、用
    的头像 发表于 10-22 10:42 465次阅读
    PCIe<b class='flag-5'>接口卡</b>设计原理图:124-基于XC7<b class='flag-5'>Z</b>015的PCIe低速扩展底板

    什么是NIC(网络接口卡)?

    网络接口卡(NIC)是一种基本的硬件组件,它使计算机或设备能够连接到网络。它可以集成到主板中,也可以作为扩展安装在计算机上,这标志着它在计算机网络中不可或缺的作用。NIC管理网络和计算机之间的数据
    的头像 发表于 09-22 14:54 736次阅读
    什么是NIC(网络<b class='flag-5'>接口卡</b>)?

    盘点 | ZLG致远电子PCle EtherCAT通讯接口卡

    随着工业智能化和信息化的快速发展,对高速、高实时性通信接口的需求日益增加。ZLG致远电子推出的基于PCle的EtherCAT总线通讯接口卡,以其高性能和灵活性,成为智能制造设备的理想选择。产品简介
    的头像 发表于 08-11 11:29 665次阅读
    盘点 | ZLG致远电子PCle EtherCAT通讯<b class='flag-5'>接口卡</b>

    国产化板卡设计原理图:2136-KC705E增强版基于FMC接口的 JFM7K325T PCIeX8 接口卡

    PCIeX8 接口卡, 无线图传, 国产化板卡, JFM7K325T, JFM7K325T板卡
    的头像 发表于 07-11 09:57 639次阅读
    国产化板卡设计原理图:2136-KC705E增强版基于FMC<b class='flag-5'>接口</b>的 JFM7K325T PCIeX8 <b class='flag-5'>接口卡</b>

    国产化板卡设计原理图:2330-基于FMC接口的JFM7K325T PCIeX4 3U PXIe接口卡

    3U PXIe, FMQL45T900I, K7图形图像硬件加速器, PXIe接口卡, JFM7K325T 芯片
    的头像 发表于 07-03 14:13 485次阅读
    国产化板卡设计原理图:2330-基于FMC<b class='flag-5'>接口</b>的JFM7K325T PCIeX4 3U PXIe<b class='flag-5'>接口卡</b>

    CAN转Modbus TCP主总线协议转换网关

    同学们,今天小编给大家详细讲解下CAN转Modbus TCP主总线协议转换网关 一,设备主要功能 JH-CAN-TCP疆鸿智能 网关实现连接C
    的头像 发表于 07-02 20:11 428次阅读
    <b class='flag-5'>CAN</b>从<b class='flag-5'>站</b>转Modbus TCP主<b class='flag-5'>站</b>总线协议转换网关

    C#上位与运动控制网络通讯的周期上报

    使用C#上位编程实现运动控制网络通讯的周期上报功能
    的头像 发表于 06-26 13:59 515次阅读
    C#<b class='flag-5'>上位</b><b class='flag-5'>机</b>与运动控制<b class='flag-5'>卡</b>网络通讯的周期上报

    热电偶温度采集模块,CAN接口

    。 一、通讯架构 CAN转网口 上位通过CAN转以太网转换器,连接多个CAN终端设备,实现热电偶温度采集功能。
    的头像 发表于 06-06 14:41 590次阅读

    【STM32系统】基于STM32设计的SD数据读取与上位显示系统(SDIO接口驱动、雷龙贴片SD

      基于STM32设计的SD数据读取与上位显示系统   演示视频: 基于STM32设计的SD数据读取与
    发表于 05-09 16:11

    工程师在产品选型的时究竟是选CAN还是CANFD接口卡呢?

    很多工程师在产品选型的时候会疑惑,究竟是选CAN接口卡还是CANFD接口卡呢?两者之间有什么区别呢?影响选择的关键因素又是什么?我们今天一个一个来拆解。1.波特率传统的CAN
    的头像 发表于 03-21 11:37 704次阅读
    工程师在产品选型的时究竟是选<b class='flag-5'>CAN</b>还是CANFD<b class='flag-5'>接口卡</b>呢?

    爱普生实时时钟与晶振技术赋能NIC网络接口卡

    在网络技术飞速发展的当下,NIC网络接口卡(网卡)作为设备与网络连接的关键桥梁,其时间同步精度直接决定了网络性能的稳定性和效率。爱普生(EPSON)凭借其领先的实时时钟(RTC)与晶振技术,为NIC
    的头像 发表于 03-12 13:38 690次阅读
    爱普生实时时钟与晶振技术赋能NIC网络<b class='flag-5'>接口卡</b>

    STM32/GD32开发板基本串口RS232\\RS485通信及CAN接口 usbhid升级 U盘升级 sd升级升级学习方案开发板

    使用VS2022开发平台,C#语言开发,该开发板提供上位机工程源码。 bin文件AES256加密解密升级功能!有以下例程:1、CAN总线升级/RS485总线升级2、USB-HID上位
    发表于 02-27 14:56

    STM32F103上位升级,RS485升级、CAN升级

    通过RS232接口升级主机 2、上位通过RS232接口升级主机及RS485从1 3、
    发表于 01-03 08:57

    运动控制网络通讯的心跳检测之C#上位编程

    使用C#上位编程实现运动控制网络通讯的心跳检测功能
    的头像 发表于 12-24 10:54 1958次阅读
    运动控制<b class='flag-5'>卡</b>网络通讯的心跳检测之C#<b class='flag-5'>上位</b><b class='flag-5'>机</b>编程