主題:EM9000CAN通訊問題 共有65589人關注過本帖 |
---|
客人 |
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里的包全部讀出來”
|
單帖管理 | 引用 | 回復 |