主题:EM9000CAN通讯问题 共有55919人关注过本帖 |
---|
yy |
1楼 信息 | 搜索 | 邮箱 |
加好友 发短信 |
Post By:2016-4-7 14:35:00 [显示全部帖子]
can_api_dll.h是CAN的COM组件工程里的文件,你需要修改这个COM组件吗? 这个COM组件一般是给C#程序调用的,如果只是希望判断CAN是否通信成功,在C#代码里面加个判断就可以了,不需要修改COM组件里的代码。 你帖出来的代码有点点逻辑问题,CAN_GetNextReceivedFrame返回FALSE只代表暂时没有收到CAN数据,不代表CAN通信失败。 通信是否成功可以从接收到的数据是否正确来判断,或者判断CAN是否有错误事件产生。
|
单帖管理 | 引用 | 回复 |
yy |
2楼 信息 | 搜索 | 邮箱 |
加好友 发短信 |
Post By:2016-4-8 9:39:00 [显示全部帖子]
下面是CAN的报错事件,及错误代码 CAN_NO_ERROR (0) // Last operation
successful
CAN_ERR_MOPS_CREATE (-1) // Mutex Creation failed CAN_ERR_PA_VA_MISSING (-2) // Physical -> Virtual Mapping failed CAN_ERR_EOPS_CREATE (-3) // Event Creation failed CAN_ERR_IRQ_SYSINTR_MISSING (-4) // IRQ -> System Interrupt ID Mapping failed CAN_ERR_INT_INIT (-5) // Interrupt Initialization failed CAN_ERR_WORKER_THREAD (-6) // Worker thread failed CAN_ERR_NO_ACK_ISSUED (-7) // No Acknowledge Issued CAN_ERR_NULL_BUF (-8) // NULL Buffer CAN_ERR_INVALID_BUFSIZE (-9) // Invalid Buffer Size CAN_ERR_NULL_LPIRESULT (-10) // NULL lpiResult field CAN_ERR_CLOCK_FAILURE (-11) // CRM Operation Failure CAN_ERR_TRANSFER_TIMEOUT (-12) // CAN transmit timeout error CAN_ERR_ARBITRATION_LOST (-13) // CAN arbitration lost error CAN_ERR_TRANSFER_ERR (-14) // CAN goto an undefined error CAN_ERR_BIT0 (-15) // At least one bit sent as dominant is received as dominant CAN_ERR_BIT1 (-16) // CANAt At least one bit sent as dominant is received as recessive CAN_ERR_ACK (-17) // CAN Acknowledge Error has been detected by the transmitter node CAN_ERR_CRC (-18) // CRC Error has been detected by the receiver node CAN_ERR_FRM (-19) // CAN Form Error has been detected by the receiver node CAN_ERR_STF (-20) // CAN Stuffing Error has been detected CAN_ERR_BUF_FULL (-21) // CAN Ring Buffer is full |
单帖管理 | 引用 | 回复 |
yy |
3楼 信息 | 搜索 | 邮箱 |
加好友 发短信 |
Post By:2016-4-11 11:38:00 [显示全部帖子]
主要是看程序的逻辑怎么写。 如果是我们的例程,当CAN有数据收到时,会将数据放入驱动的一个BUFFER里,然后会产生一个事件通知上层应用程序,例程接收到这个事件后,会循环调用CAN_GetNextReceivedFrame,将BUFFER里所有的数据都都出来显示,如果按你的改发,读前面包时flagcan被设成1,读完所有包后flagcan被设成0,读包是非常快的,所以flagcan基本一直都是0,所以我认识这个逻辑是不行的。 CAN出错后请调用我们提供的接口,重置下CAN就行了,stopchip和startchip,例程里有。
|
单帖管理 | 引用 | 回复 |
yy |
4楼 信息 | 搜索 | 邮箱 |
加好友 发短信 |
Post By:2016-4-12 9:30:00 [显示全部帖子]
在CAN没有报错的时候,应该认为通信没有问题。当有CAN数据收到时,上层应用能收到CAN事件,收到事件就表示有数据收到,其它时候表示没有数据通信。
|
单帖管理 | 引用 | 回复 |
yy |
5楼 信息 | 搜索 | 邮箱 |
加好友 发短信 |
Post By:2016-4-12 10:58:00 [显示全部帖子]
可以参考程序中的代码。 我们驱动的接口及注释在can_api.h里面,你可以看到CAN_GetRxEvent这个函数,这个函数就是获得驱动创建的CAN接收事件,当CAN驱动接收到数据后,会激活这个event。 在例程中,我们将CAN又封装了一次,代码在EM9000_CAN.cpp里面,你可以看代码就知道例程是如何调用can_api.h里的接口的。在打开CAN的时候,调用的StartCan里面调用CAN_GetRxEvent获得了CAN接收事件,然后在接收线程ReadThreadFunc里面,调用的WaitForSingleObject去等待这个事件。当等到这个事件时,就能判断有CAN数据接收 CAN错误事件同理,和CAN接收事件原理一样的。 |
单帖管理 | 引用 | 回复 |
yy |
6楼 信息 | 搜索 | 邮箱 |
加好友 发短信 |
Post By:2016-4-12 11:00:00 [显示全部帖子]
如果你用C来编程,看C的例程应该很清晰些。 C例程还封装了一个CAN的类,而动态链接库里是直接调用的CAN驱动接口,没有封装类。
|
单帖管理 | 引用 | 回复 |
yy |
7楼 信息 | 搜索 | 邮箱 |
加好友 发短信 |
Post By:2016-4-13 16:01:00 [显示全部帖子]
因该没有多大延迟的。收到接收事件后,需要将BUFFER里的包全部读出来,你再测试下,你的延迟有多少呢?
|
单帖管理 | 引用 | 回复 |
yy |
8楼 信息 | 搜索 | 邮箱 |
加好友 发短信 |
Post By:2016-4-14 9:26:00 [显示全部帖子]
应该是代码处理逻辑问题,延迟几ms最多几十ms是正常的,0.5秒太长,不可能。 之前出现过这样的错误,在接收到event事件后,只读了一帧出来,同时收到的其它帧得等到下次event才接收。 你检查下代码有没有我说的这个问题,按我上个回复里来写“收到接收事件后,需要将BUFFER里的包全部读出来”
|
单帖管理 | 引用 | 回复 |