激情综合丁香-激情综合六月-激情综合婷婷亚洲图片-激情综合图区-激情综合网五月


主題:EM9260 ETA701 雙CAN系統

  共有37206人關注過本帖    
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。。。

不知道出錯原因是什么?希望能幫下忙。謝謝了!

  單帖管理 | 引用 | 回復 回到頂部

返回首頁

EM9260 ETA701 雙CAN系統

用戶名:
            驗證碼: 驗證碼,看不清楚?請點擊刷新驗證碼
內容:
主站蜘蛛池模板: 日韩色视频在线观看| 综合图片区| 老司机日日摸夜夜摸精品影院| 国产午夜成人无码免费看| 午夜一区二区免费视频| 91久久久久久久| 久久久久久久国产视频| 亚洲一级毛片免费看| 好好的曰www视频在线观看| 国产亚洲欧美日本一二三本道| 爱福利一区二区| 91免费短视频| 国产精品999在线| 久久精品国产欧美成人| 日本一级二级三级久久| 亚洲国产天堂久久九九九| 96一级毛片| 一次性a爱片| 成人午夜久久精品| 欧美片免费观看网址| 国产成人免费网站| 国产精品亚洲国产三区| 黄色片aa| 最新精品| 91蝌蚪在线视频| 超级碰碰碰碰97久久久久| 国产一区二区三区免费| 久久高清一区二区三区| 欧美日韩a级片| 日韩欧美国产精品| 亚洲aav| 亚洲婷婷综合中文字幕第一页| 最新91视频| 91久久国产精品视频| 97福利在线| www.黄色大片| 99久久国语对白精品露脸| 一区视频免费观看| 一级毛片网| www.久久色| 777色淫网站女女|