主题:EM9260 ETA701 双CAN系统 共有32388人关注过本帖 |
---|
STUDENT |
1楼 |
EM9260 ETA701 双CAN系统 Post By:2011-4-1 15:29:00 [只看该作者]
您好 我根据贵公司的《双CAN接口快速实现方案》一问,想要用ETA701及EM9260组成的双CAN系统。现编写一程序,让CAN2发送一组标准桢数据给CAN1接收。我根据贵公司提供的CANTEST程序,改写如下:
// #include "stdafx.h" #include "lcd_api.h" #include "EM9260_CAN.h" #include "EM9260_Key.h"  #include "EM9260_ISA_DIO.h"  static void CALLBACK OnReceive( ); static void CALLBACK OnError( ); class CEM9260_CAN  m_CAN; class CEM9260_CAN  m_CAN2; int    type; ULONG  ReceiveLen; ULONG  SendLen; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR    lpCmdLine, int       nCmdShow) { BOOL    bResult; char    str[100]; UINT    CanNo; UCHAR   Baud; UCHAR   Filter[9]; int     i1; char    Buf[14]; // fill AcceptanceFilter<|>s parameters Filter[0] = 0; // ACR Filter[1] = 0x5f; // ACR Filter[2] = 0; // ACR Filter[3] = 0x1f; // ACR Filter[4] = 0xff; // AMR Filter[5] = 0xff; // AMR Filter[6] = 0xff; // AMR Filter[7] = 0xff; // AMR Filter[8] = DUAL_FILTER_MODE; // Filter Mode Baud = CAN_TIMING_250K;     // for 250Kbps CanNo = 1; i1 = wcslen( lpCmdLine ); if( i1>0 ) { wcstombs( str, lpCmdLine, i1 ); //Baud = atoi( str ); sscanf( str, "%d %d", &CanNo, &Baud ); } printf( "CanNumber: %d Baud: %d\r\n", CanNo, Baud ); bResult = m_CAN.StartCAN( CanNo, Baud, (BYTE*)Filter, 9 ); if( bResult==FALSE ) { printf("can1 start failed!! \n" ); return -1; }     else       printf("can1 start succeed!! \n"); Filter[0] = 0x4a; // ACR Filter[1] = 0x5f; // ACR Filter[2] = 0x4a; // ACR Filter[3] = 0x1f; // ACR Filter[4] = 0x4a; // AMR Filter[5] = 0xff; // AMR Filter[6] = 0x4a; // AMR Filter[7] = 0xff; // AMR Filter[8] = DUAL_FILTER_MODE; // Filter Mode bResult = m_CAN2.StartCAN( 2, Baud, (BYTE*)Filter, 9 ); if( bResult==FALSE ) { printf("can2 start failed!! \n" ); return -1; }     else       printf("can2 start succeed!! \n"); Buf[0] = 8; Buf[1] = 1; Buf[2] = 0; for( i1=3; i1<11; i1++ ) { Buf[i1] = (char)i1; } m_CAN.OnRead = OnReceive; m_CAN.OnError = OnError; ReceiveLen = 0; SendLen = 0; bResult = m_CAN2.WriteCAN( (BYTE*)Buf, 11 ); if( bResult==FALSE ) { printf("can2 send failed!! \r\n" ); return -1; }     else       printf("can2 send succeed!! \r\n"); for(  ) { printf("waiting for message \r\n"); Sleep( 1000 ); } m_CAN.StopCAN( ); m_CAN2.StopCAN( ); return 0; } void CALLBACK OnReceive( ) { char     RxBuf[14]; char     str[200]; UCHAR    dlen;     printf("can1 receive succeed!! \r\n"); memcpy( RxBuf, &m_CAN.RxMFrame, 13 ); dlen = RxBuf[0]&0x0f; if( RxBuf[0]&0x80 ) // 扩展帧 { m_CAN.WriteCAN( (BYTE*)RxBuf, dlen+5 ); } else // 标准帧 {     m_CAN.WriteCAN( (BYTE*)RxBuf, dlen+3); } ReceiveLen += dlen; } void CALLBACK OnError( ) { } 程序输出结果为: CanNumber:1 Baud: 5 can1 start succeed!! can2 start succeed!! can2 send succeed!! waiting for message 1 2 1 然后该程序自动结束运行。不知道我的程序是哪里出了问题?CAN1没有接收到数据。 另外,程序最后输出的1,2,1三个数字是否表示CAN1的接收错误?这些错误具体指什么? |
|
单帖管理 | 引用 | 回复 |
zhl |
2楼 |
Post By:2011-4-1 15:53:00 [只看该作者]
1、回调函数的赋值要放在StartCAN之前,如:
m_CAN.OnRead = OnReceive; m_CAN.OnError = OnError; bResult = m_CAN.StartCAN( CanNo, Baud, (BYTE*)Filter, 9 ); 2、CAN2接口class对象,没有设置回调函数。 |
|
单帖管理 | 引用 | 回复 |
STUDENT |
3楼 |
Post By:2011-4-6 14:39:00 [只看该作者]
根据回复,修改程序如下:
#include "stdafx.h" #include "lcd_api.h" #include "EM9260_CAN.h" #include "EM9260_Key.h"  #include "EM9260_ISA_DIO.h"  static void CALLBACK OnReceive( ); static void CALLBACK OnError( ); static void CALLBACK OnReceive2( ); static void CALLBACK OnError2( ); class CEM9260_CAN  m_CAN; class CEM9260_CAN  m_CAN2; int    type; ULONG  ReceiveLen; ULONG  SendLen; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR    lpCmdLine, int       nCmdShow) { BOOL    bResult; char    str[100]; UINT    CanNo; UCHAR   Baud; UCHAR   Filter[9]; int     i1; char    Buf[14]; // fill AcceptanceFilter<|>s parameters Filter[0] = 0; // ACR Filter[1] = 0x5f; // ACR Filter[2] = 0; // ACR Filter[3] = 0x1f; // ACR Filter[4] = 0xff; // AMR Filter[5] = 0xff; // AMR Filter[6] = 0xff; // AMR Filter[7] = 0xff; // AMR Filter[8] = DUAL_FILTER_MODE; // Filter Mode Baud = CAN_TIMING_250K;     // for 250Kbps CanNo = 1; i1 = wcslen( lpCmdLine ); if( i1>0 ) { wcstombs( str, lpCmdLine, i1 ); //Baud = atoi( str ); sscanf( str, "%d %d", &CanNo, &Baud ); } printf( "CanNumber: %d Baud: %d\r\n", CanNo, Baud ); m_CAN.OnRead = OnReceive; m_CAN.OnError = OnError; ReceiveLen = 0; SendLen = 0; bResult = m_CAN.StartCAN( CanNo, Baud, (BYTE*)Filter, 9 ); if( bResult==FALSE ) { printf("can1 start failed!! \n" ); return -1; }     else       printf("can1 start succeed!! \n"); Filter[0] = 0x4a; // ACR Filter[1] = 0x5f; // ACR Filter[2] = 0x4a; // ACR Filter[3] = 0x1f; // ACR Filter[4] = 0x4a; // AMR Filter[5] = 0xff; // AMR Filter[6] = 0x4a; // AMR Filter[7] = 0xff; // AMR Filter[8] = DUAL_FILTER_MODE; // Filter Mode m_CAN2.OnRead = OnReceive2; m_CAN2.OnError = OnError2; bResult = m_CAN2.StartCAN( 2, Baud, (BYTE*)Filter, 9 ); if( bResult==FALSE ) { printf("can2 start failed!! \n" ); return -1; }     else       printf("can2 start succeed!! \n");     //发送数据内容 Buf[0] = 8; Buf[1] = 1; Buf[2] = 0; for( i1=3; i1<11; i1++ ) { Buf[i1] = (char)i1; }     //发送测试1:CAN2向CAN1发送 bResult = m_CAN2.WriteCAN( (BYTE*)Buf, 11 ); if( bResult==FALSE ) { printf("can2 send failed!! \r\n" ); return -1; }     else       printf("can2 send succeed!! \r\n");    //发送测试2:CAN1向CAN2发送 /*bResult = m_CAN.WriteCAN( (BYTE*)Buf, 11 ); if( bResult==FALSE ) { printf("can1 send failed!! \r\n" ); return -1; }     else       printf("can1 send succeed!! \r\n");  */  for(  ) { printf("waiting for message \r\n"); Sleep( 1000 ); } m_CAN.StopCAN( ); m_CAN2.StopCAN( ); return 0; } void CALLBACK OnReceive( ) { char     RxBuf[14]; char     str[200]; UCHAR    dlen;     printf("can1 receive succeed!! \r\n"); memcpy( RxBuf, &m_CAN.RxMFrame, 13 ); dlen = RxBuf[0]&0x0f; if( RxBuf[0]&0x80 ) // 扩展帧 { m_CAN.WriteCAN( (BYTE*)RxBuf, dlen+5 ); } else // 标准帧 {     m_CAN.WriteCAN( (BYTE*)RxBuf, dlen+3); } ReceiveLen += dlen; } void CALLBACK OnError( ) { printf("can1 receive error!! \r\n"); } void CALLBACK OnReceive2( ) { char     RxBuf[14]; char     str[200]; UCHAR    dlen;     printf("can2 receive succeed!! \r\n"); memcpy( RxBuf, &m_CAN.RxMFrame, 13 ); dlen = RxBuf[0]&0x0f; if( RxBuf[0]&0x80 ) // 扩展帧 { m_CAN2.WriteCAN( (BYTE*)RxBuf, dlen+5 ); } else // 标准帧 {     m_CAN2.WriteCAN( (BYTE*)RxBuf, dlen+3); } ReceiveLen += dlen; } void CALLBACK OnError2( ) { printf("can2 receive error!! \r\n"); } 程序意图为初始化CAN1,CAN2,并从CAN2向CAN1发送一组数据。 程序执行的结果为: CanNumber:1 Baud: 5 can1 start succeed!! can2 start succeed!! can2 send succeed!! waiting for message 1 can1 receive error!! 2 can1 receive error!! 1 can2 receive error!! 2 can2 receive error!! waiting for message waiting for message waiting for message。。。 不知道是什么原因导致出错? 同时,如果将同一组数据由CAN1向CAN2发送时,程序运行结果为: CanNumber:1 Baud: 5 can1 start succeed!! can2 start succeed!! can1 send succeed!! waiting for message 3 can2 receive error!! 1 can1 receive error!! 2 can1 receive error!! waiting for message waiting for message waiting for message。。。 不知道出错原因是什么?希望能帮下忙。谢谢了! |
|
单帖管理 | 引用 | 回复 |