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


主題:EM9260 ETA701 雙CAN系統

  共有37222人關注過本帖    
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系統

用戶名:
            驗證碼: 驗證碼,看不清楚?請點擊刷新驗證碼
內容:
主站蜘蛛池模板: 中国产一级毛片| 日韩午夜高清福利片在线观看| 草啪啪| 久久综合久久精品| 亚洲欧美视频网站| 日本在线网| 免费看欧美成人性色生活片| 国产免费福利体检区久久| 深夜做爰性大片很黄很色视频| 国产精品一二区| 日本hd高清xxxxvideos| 九九九精品视频免费| 在线免费观看黄色小视频| 欧美日韩中文字幕久久伊人| 特级毛片视频在线| 国产亚洲精品福利片| 婷婷影院在线综合免费视频| 综合精品一区| 尤物视频网在线观看| 午夜伦情电午夜伦情影院| 在线免费观看色| 自拍影视| 国产a三级三级三级| 黄片毛片免费看| 国产麻豆影院| 欧美视频一区二区| 1024 在线观看视频免费| 一级片在线观看视频| 小泽玛利亚一区二区| 女人被狂躁的视频免费动图| 亚洲精品成人网| 青草伊人久久| 欧美日韩国产超高清免费看片| 国产三级91| 精品国产999| 国产在线午夜| 九九九网站| 九九在线偷拍视频在线播放| 久久久久久国产精品免费免| 欧美大片国产在线永久播放| 亚洲福利区|