CAN总线中继器常见问题解答2

2025-04-20 15:05:01

CAN总线中继器在工业领域具有很重要的地位,今天接着为大家讲述CAN总线中继器常见问题解答2。

CAN总线中继器常见问题解答2

工具/原料

广成CAN总线中继器

常见问题2

1、8. 如何处理应用中的错误?错误主要分为函数调用错误和CAN-bus通讯错误两种。 函数调用错误一般由参数错误引起,如:设备号超出范围,类型号错误等,用 Win32函数GetLastErr泠贾高框or返回的错误号是87, 还有的是对未打开的设备进行操作, 实际是对一个非法句柄操作, 根据具体函数调用情况都有相应的 Win32 标准错误码提供, 用户可以使用GetLastError 进行错误分析, 这部分除错工作一般应该在设计时完成。对于CAN-bus通讯错误, 一般由CAN网络引起, 也可能因用户设置不当而引起, 如: 波特率设置不一致、 没有启动CAN控制器便调用发送函数等。 大部分错误已经在设备驱动中作了简单的处理, 如果要进行更深层次的错误分析和处理, 可以调用ReadCANStatus 函数。另外需要注意的是数据溢出中断错误, 它的产生有两种可能: (1) 软件接收缓区冲溢出。 这说明应用程序无法及时处理接收到的数据, 这时用户应该优化应用程序或更改通讯策略。 (2)硬件接收缓冲区溢出。 产生这种错误是由于接收端 PC 中断延迟太大而引起的。 只能通过 提升计算机性能或协调其余节点适当降低发送速度来解决。

2、9. 打开关闭设备要注意哪些事项?GCAN-206模块接口卡提供2个CAN端口, 用户能够在同一程序中操作不同的端口。 GCAN-206模块接口卡不允许共享方式打开设备, 同一个设备不可被不同进程通过调用OpenDevice函数多次打开。OpenDevice和CloseDevice函数一般在应用程序初始化和退出时只需要调用一次。 当关闭设备时若能当前端口不再使用, 应该先调用ResetCAN函数使当前端口脱离CAN总线, 设备驱动程序只会在最后一个设备句柄关闭时才自动调用ResetCAN退出CAN总线的连接

3、10. 如何使用中断方式操作通讯卡?GCAN-206模块不提供直接操作中断的接口, 因为中断已经在驱动程序中处理了。 需要在应用程序中操作中断的多数原因是: 程序不知道数据何时能到达设备, 需要得到一个接收消息的触发才能从缓冲读取数据。 解决这个问题的一般手段是使用多线程( 或多任务) 。 即启动一个新的线程, 在线程中循环调用Receive函数来查询接收缓冲。 Receive内部已实现了阻塞机制, 在缓冲里没有数据时会挂起调用线程, 这时不会占用CPU的时间, 应用程序仍然可以处理其他事务。

4、11. 如何更好的使用Transmit发送函数?GCAN-206模块的驱动提供约128帧发送缓冲FIFO, 每次Transmit调用最多发送约128帧数据。 发送设备的发送速度由当前计算机软硬件性能决定, 一般连续发送速度在2000 fps 左右(标准数据帧11Bytes, 1Mbps), 若发送速度过快将有可能使远端接收设备数据溢出而失去响应, 这样用户可在应用编程中适当添加延时以降低发送速度。发送过程中每一帧都有超时限制, 单帧发送时超时时间约2秒, 一次发送多帧时最后一帧发送超时为2秒, 其余为1秒。 发送超时一般由于CAN总线繁忙且当前节点优先级较低时发生, 并不是函数调用或通讯错误, 用户可以编程实现重发(一般中低速网络极少发生发送超时事件)。 因此, 在系统设计时注意保证CAN总线占用不应该超过总线容量的60-70%。

5、12. 如何更好的使用Receive函数?设备驱动提供100000帧软件接收缓冲区, 这为应用编程人员提供了充足的反应处理时间。 当软件接收缓冲数据溢出时设备驱动程序将调用ResetCAN复醐蛑臀谁位CAN总线, 同时置位CAN status的数据溢出中断标志位, 注意软件缓冲溢出和CAN控制器硬件缓冲溢出都是使用该标志位。接收函数提供Wait参数适合用于多线程编程, 函数内部封装一个阻塞函数,其参数Wait含义如同Win32的WaitForSingleObject的dwMilliseconds参数(请参考Win32API说明), 它 为Receive指定一个超时返回时间, 单位为毫秒。当Wait为0时函数调用时立即返回当前成功读取到的帧数, 若接收缓冲为空则返回0。 当Wait非0时, 若函数调用时接收缓冲中已经有数据则马上返回成功读取的帧数, 若这时接收缓冲为空, 函数将等待一个指定的超时到达或接收到数据才返回成功接收的帧数。 当Wait为0xFFFFFFFF时为无限等待直到有数据接收到, 建议不要把Wait设得过大, 无限等待更应该注意。nFrames等于0时函数实际是一个通知消息返回, 不要求读接收缓冲区, 是一个特殊的技巧性用法。 注意: 若在主线程中调用Receive函数并且Wait非0则有可能引起应用程序暂时性的失去响应。 若通过查询方式接收, 一般应该把Wait设为0。

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢