主题:EM9000CAN通讯问题

  共有27078人关注过本帖    
客人
1楼


EM9000CAN通讯问题  发帖心情 Post By:2016-4-7 10:39:00   [只看该作者]

请问在程序中怎样设置CAN通讯成功的状态或标志位,CAN_API_DLL.h文件里只有CAN设备接收数据的函数定义,应该如何利用?
// 功能描述:读取CAN设备接收数据包。
// 输入参数 hDevice: 已创建CAN流式设备的句柄。
// 输出参数 pRxFrameBuffer: 用于读取CAN设备接收到的数据包。 
// 返回值 = TRUE:  从CAN设备接收到数据,并将接收到的数据包读入pRxFrameBuffer。
//        = FALSE: CAN设备没有接收数据。
CAN_API_DLL_API BOOL CAN_GetNextReceivedFrame( HANDLE hDevice, MessageFrame *RxFrameBuffer );
在CanBus.cpp的文件里这样写不对
if(CAN_GetNextReceivedFrame(self->m_hCAN,&RxFrame))
{
self->OnReceiveData(&RxFrame);
flagcan = 1;
            
}
else //if(!i)//即使有数据也能进入这个条件
{
flagcan = 2;
{
Sleep(0);
Sleep(0);
Sleep(0);
Sleep(0);
Sleep(0);
Sleep(0);
Sleep(0);
Sleep(0);
Sleep(0);
Sleep(0);
Sleep(0);
Sleep(0);
}/**/
             }

  单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
yy
2楼 信息 | 搜索 | 邮箱


加好友 发短信
  发帖心情 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是否有错误事件产生。

  单帖管理 | 引用 | 回复 回到顶部
客人
3楼


CAN通讯判断问题  发帖心情 Post By:2016-4-8 8:02:00   [只看该作者]

您好,现在问题是用CAN口调试器测试,数据发送周期为500ms,在CAN口一直发送数据的时候,为什么还能计入到else里面?else判断不是应该在CAN口没有收到数据的时候才能进入的么?

  单帖管理 | 引用 | 回复 回到顶部
客人
4楼


如何在程序中判断错误检测事件?  发帖心情 Post By:2016-4-8 9:15:00   [只看该作者]

我的是VC++程序,在程序里如何判断错误检测事件?如果修改COM组件CAN_API_DLL.h的话您能帮忙改下么?还是需要我自己去改。
if (WAIT_OBJECT_0 == WaitForSingleObject(self->m_hErrEvent,1000) )//modify20160309
{
bResult = CAN_GetError( self->m_hCAN, &ErrorCode );
dwECCRegCode = CAN_GetECCReg( self->m_hCAN );

if( bResult )
{
self->OnError(ErrorCode, dwECCRegCode);
flagcan_set=0;//CAN通讯异常
}
else
{
flagcan_set=1;//CAN通讯正常(没有错误事件时)

}


}
那如何判断CAN通讯中断?CAN通讯错误事件包括什么事件?代码都是多少?


  单帖管理 | 引用 | 回复 回到顶部
客人
5楼


  发帖心情 Post By:2016-4-8 9:38:00   [只看该作者]

如果你是用VC++编程,建议你参考我们的C例程,用COM组件来调用会比较复杂,不推荐。

就你贴出来的代码,if条件成立就表示收到错误事件了,当出现CAN报错,最好都重置一下CAN。


  单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
yy
6楼 信息 | 搜索 | 邮箱


加好友 发短信
  发帖心情 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

  单帖管理 | 引用 | 回复 回到顶部
客人
7楼


Can接受数据  发帖心情 Post By:2016-4-8 10:16:00   [只看该作者]

如果想知道CAN接收到数据时显示一个状态;CAN没有收到数据时显示另外一个状态。可以按照我开始写的那个返回值为真时设置一个标志位;else返回值为假时设置一个标志位么?

  单帖管理 | 引用 | 回复 回到顶部
客人
8楼


如何判断CAN是否接受到数据  发帖心情 Post By:2016-4-8 14:17:00   [只看该作者]

我在判断没有接收到数据的else里面加了标志位以后,即使有数据已进入else语句,不知道为什么。

  单帖管理 | 引用 | 回复 回到顶部
客人
9楼


如何重置CAN?  发帖心情 Post By:2016-4-11 9:44:00   [只看该作者]

请问如果CAN出错了怎样进行重置?

  单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
yy
10楼 信息 | 搜索 | 邮箱


加好友 发短信
  发帖心情 Post By:2016-4-11 11:38:00   [只看该作者]

主要是看程序的逻辑怎么写。

如果是我们的例程,当CAN有数据收到时,会将数据放入驱动的一个BUFFER里,然后会产生一个事件通知上层应用程序,例程接收到这个事件后,会循环调用CAN_GetNextReceivedFrame,将BUFFER里所有的数据都都出来显示,如果按你的改发,读前面包时flagcan被设成1,读完所有包后flagcan被设成0,读包是非常快的,所以flagcan基本一直都是0,所以我认识这个逻辑是不行的。

CAN出错后请调用我们提供的接口,重置下CAN就行了,stopchip和startchip,例程里有。

  单帖管理 | 引用 | 回复 回到顶部
客人
11楼


如何判断CAN什么时候接收到数据,什么时候没有接收到数据呢?  发帖心情 Post By:2016-4-12 7:29:00   [只看该作者]

您好?您说的我的逻辑有问题,那您能给我提示下应该用什么标志位或者逻辑来进行判断CAN通讯成功和异常么?或者说想判断什么时候CAN收到数据,什么时候CAN没有收到数据?

  单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
yy
12楼 信息 | 搜索 | 邮箱


加好友 发短信
  发帖心情 Post By:2016-4-12 9:30:00   [只看该作者]

在CAN没有报错的时候,应该认为通信没有问题。当有CAN数据收到时,上层应用能收到CAN事件,收到事件就表示有数据收到,其它时候表示没有数据通信。

  单帖管理 | 引用 | 回复 回到顶部
客人
13楼


您好,您说的上层接收到的CAN接收事件是自己定义的还是程序中的m_hRxEvent?  发帖心情 Post By:2016-4-12 10:07:00   [只看该作者]

如何判断?多谢了。

  单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
yy
14楼 信息 | 搜索 | 邮箱


加好友 发短信
  发帖心情 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
15楼 信息 | 搜索 | 邮箱


加好友 发短信
  发帖心情 Post By:2016-4-12 11:00:00   [只看该作者]

如果你用C来编程,看C的例程应该很清晰些。

C例程还封装了一个CAN的类,而动态链接库里是直接调用的CAN驱动接口,没有封装类。

  单帖管理 | 引用 | 回复 回到顶部
客人
16楼


CAN通讯速率问题  发帖心情 Post By:2016-4-13 15:28:00   [只看该作者]

就是在接受CAN口调试器发送的数据时,发送周期设置为20ms时,数据有很大的延迟,不知道是什么原因?CAN口发送数据以及读写的速度不是很快的么?

  单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
yy
17楼 信息 | 搜索 | 邮箱


加好友 发短信
  发帖心情 Post By:2016-4-13 16:01:00   [只看该作者]

因该没有多大延迟的。收到接收事件后,需要将BUFFER里的包全部读出来,你再测试下,你的延迟有多少呢?

  单帖管理 | 引用 | 回复 回到顶部
客人
18楼


发送周期500ms时能捕捉到数据,发送周期为20ms时大概延时0.5-1s  发帖心情 Post By:2016-4-14 8:15:00   [只看该作者]

发送周期500ms时能捕捉到数据,基本上是实时显示,延时时间不长,发送周期为20ms时大概延时0.5-1s,有明显延迟,如果接相关传感器的话是接收不到数据的,难道是协议有问题?但是为什么用CAN口调试工具就可以接收数据啊?

  单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
yy
19楼 信息 | 搜索 | 邮箱


加好友 发短信
  发帖心情 Post By:2016-4-14 9:26:00   [只看该作者]

应该是代码处理逻辑问题,延迟几ms最多几十ms是正常的,0.5秒太长,不可能。

之前出现过这样的错误,在接收到event事件后,只读了一帧出来,同时收到的其它帧得等到下次event才接收。

你检查下代码有没有我说的这个问题,按我上个回复里来写“收到接收事件后,需要将BUFFER里的包全部读出来”

  单帖管理 | 引用 | 回复 回到顶部

返回首页

EM9000CAN通讯问题

用户名:
            验证码: 验证码,看不清楚?请点击刷新验证码
内容: