|
1.安裝方法,CAN分析儀插入電腦,安裝CP2102芯片的驅(qū)動(dòng)程序。安裝完畢打開AccessPort.exe串口調(diào)試助手,波特率設(shè)置為256000。接收區(qū)域設(shè)置為“字符顯示”
注:發(fā)送指令最好使用快捷鍵F10 ,避免接收數(shù)據(jù)過(guò)程中,軟件按鈕不夠靈敏。
2.關(guān)于CAN標(biāo)識(shí)符 效驗(yàn)碼和屏蔽碼的關(guān)系舉例如下:
例:
采集標(biāo)識(shí)為066 067 068 069多標(biāo)識(shí)500K速率的標(biāo)準(zhǔn)CAN數(shù)據(jù)
STD04 066 068 7FE 7FE
根據(jù)十六進(jìn)制把標(biāo)識(shí)分解二進(jìn)制如下
8 4 2 1 8 4 2 1 8 4 2 1
0 0 0 0 0 1 1 0 0 1 1 0 ID:066
0 0 0 0 0 1 1 0 0 1 1 1 ID:067
0 0 0 0 0 1 1 0 1 0 0 0 ID:068
0 0 0 0 0 1 1 0 1 0 0 1 ID:069
發(fā)揮雙濾波的作用,把上述ID分為兩組。
第一組
0 0 0 0 0 1 1 0 0 1 1 0 ID:066
0 0 0 0 0 1 1 0 0 1 1 1 ID:067
第二組
0 0 0 0 0 1 1 0 1 0 0 0 ID:068
0 0 0 0 0 1 1 0 1 0 0 1 ID:069
第一組相同的位為
0 0 0 0 0 1 1 0 0 1 1 X ID:066
0 0 0 0 0 1 1 0 0 1 1 X ID:067
X先認(rèn)為是0吧,即效驗(yàn)碼為 066.
X屏蔽碼中也認(rèn)為是0,其它為1,所以屏蔽碼為7FE
第二組相同的位為
0 0 0 0 0 1 1 0 1 0 0 X ID:068
0 0 0 0 0 1 1 0 1 0 0 X ID:069
X先認(rèn)為是0吧,即效驗(yàn)碼為 068
X屏蔽碼中也認(rèn)為是0,其它為1,所以屏蔽碼為7FE
屏蔽碼一個(gè)位是1的時(shí)候,是必須比較該位的意思,某些CAN控制器則相反,只是把7FE反過(guò)來(lái)001作為屏蔽碼?梢哉J(rèn)為 (線上的CAN ID & 屏蔽碼(某些芯片屏蔽碼要取反)) == 效驗(yàn)碼 則該數(shù)據(jù)允許接收。
stm32單片機(jī)源程序:
- #include "stm32f10x.h"
- #include "includes.h"
- #include "string.h"
- u8 Check_Number(u8 checkdata);
- u8 ASCII_4BIT(u8 data);
- __IO u8 DisRAM[50];
- __IO RAMVale SRAMCOUNT;
- int main(void)
- {
- CanTxMsg TxMessage;
- __IO CanRxMsg RxMessage;
- uint8_t i,TransmitMailbox;
- u16 ID1,ID2,MID1,MID2;
- u32 id1,id2,mid1,mid2;
- BSP_Init();
- SRAMCOUNT.TURN = 0;
- while(1)
- {
- if ((CotrolVale & 0x01) == 0x01)
- {
- printf("*****************************************你大爺*****************************************\n");
- printf("網(wǎng)址:http://shop107599058.taobao.com \n");
- printf("產(chǎn)品名:CAN分析儀 \n");
- printf("使用說(shuō)明: \n");
- printf("1.標(biāo)準(zhǔn)CAN數(shù)據(jù)采集方法 \n");
- printf(" CAN速率 效驗(yàn)位2 屏蔽位2 CAN速率: 2000000 / CAN速率 = xx \n");
- printf(" ↓ ↓ ↓ \n");
- printf(" 指令:STDxx XXX XXX XXX XXX \n");
- printf(" ↑ ↑ \n");
- printf(" 效驗(yàn)位1 屏蔽位1 \n");
- printf(" 例1:采集所有線上500K速率的標(biāo)準(zhǔn)CAN數(shù)據(jù) 例2:采集標(biāo)識(shí)為 066 125K速率的標(biāo)準(zhǔn)CAN數(shù)據(jù) \n");
- printf(" STD04 000 000 000 000 STD16 066 066 7FF 7FF \n");
- printf(" 例3:采集標(biāo)識(shí)為 066 067 33.3K速率的標(biāo)準(zhǔn)CAN數(shù)據(jù) 例4:采集標(biāo)識(shí)為066 067 068 069多標(biāo)識(shí)500K速率的標(biāo)準(zhǔn)CAN數(shù)據(jù) \n");
- printf(" STD60 066 067 7FF 7FF STD04 066 068 7FE 7FE(算法詳見配套文檔) \n");
- printf("2.擴(kuò)展CAN數(shù)據(jù)采集方法 \n");
- printf(" CAN速率 效驗(yàn)位2 屏蔽位2 CAN速率: 2000000 / CAN速率 = xx \n");
- printf(" ↓ ↓ ↓ \n");
- printf(" 指令:EXTxx XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX \n");
- printf(" ↑ ↑ \n");
- printf(" 效驗(yàn)位1 屏蔽位1 \n");
- printf(" 例1:采集所有線上500K速率的擴(kuò)展CAN數(shù)據(jù) 例2:采集標(biāo)識(shí)為 193F1343 125K速率的擴(kuò)展CAN數(shù)據(jù) \n");
- printf(" EXT04 00000000 00000000 00000000 00000000 EXT16 193F1343 193F1343 1FFFFFFF 1FFFFFFF \n");
- printf(" 例3:采集標(biāo)識(shí)為 193F1343 16EBF836 33.3K速率的擴(kuò)展CAN數(shù)據(jù) \n");
- printf(" EXT60 193F1343 16EBF836 1FFFFFFF 1FFFFFFF \n");
- printf(" 例4:采集標(biāo)識(shí)為 16EBF835 16EBF836 16EBF837 16EBF838 等多標(biāo)識(shí)500K速率的擴(kuò)展CAN數(shù)據(jù) \n");
- printf(" EXT04 16EBF830 16EBF830 1FFFFFF0 1FFFFFF0 (算法詳見配套文檔) \n");
- printf("3.CAN數(shù)據(jù)發(fā)送 \n");
- printf(" 標(biāo)準(zhǔn)與擴(kuò)展 數(shù)據(jù)長(zhǎng)度 CAN速率: 2000000 / CAN速率 = xx \n");
- printf(" ↓ ↓ \n");
- printf(" 指令: SENDSTD(EXT)xx X XXXXXXXX XXX XXX XXX XXX XXX XXX XXX XXX XXX \n");
- printf(" ↑ ↑ \n");
- printf(" CAN速率 發(fā)送的數(shù)據(jù)幀 \n");
- printf(" 例1:發(fā)送500K標(biāo)準(zhǔn)CAN數(shù)據(jù) \n");
- printf(" SENDSTD04 8 066 01 02 03 04 05 06 07 08 \n");
- printf(" 例2:發(fā)送125K擴(kuò)展CAN數(shù)據(jù) \n");
- printf(" SENDEXT16 3 193F1343 01 02 03 \n");
- printf("4.單線CAN數(shù)據(jù)采集:請(qǐng)將CAN高連接單線數(shù)據(jù)線,CAN低連接接地端. \n");
- CotrolVale = 0;
- }
- else if ((CotrolVale & 0x02) == 0x02)
- {
- CAN_Cofig(Check_Number(Cmd[7])*10 + Check_Number(Cmd[8]));
- if (!strncmp((const char *)Cmd+4,"STD",3))
- {
- TxMessage.RTR = CAN_RTR_DATA;
- TxMessage.IDE = CAN_ID_STD;
- TxMessage.DLC = Check_Number(Cmd[10]);
- TxMessage.StdId = (u32)Check_Number(Cmd[12])<<8;
- TxMessage.StdId |= (u32)Check_Number(Cmd[13])<<4;
- TxMessage.StdId |= (u32)Check_Number(Cmd[14]);
- for(i = 0;i < TxMessage.DLC;i++)
- {
- TxMessage.Data[i] = (u8)Check_Number(Cmd[16+3*i])<<4;
- TxMessage.Data[i] |= (u8)Check_Number(Cmd[17+3*i]);
- }
- if ((CotrolVale & 0x80) != 0x80)
- {
- TransmitMailbox = CAN_Transmit(CAN1,&TxMessage);
- while (CAN_TransmitStatus(CAN1,TransmitMailbox) != 1);
- printf("標(biāo)準(zhǔn)CAN數(shù)據(jù)已發(fā)送...\n");
- CotrolVale = 0;
- }
- }
- else if (!strncmp((const char *)Cmd+4,"EXT",3))
- {
- TxMessage.RTR = CAN_RTR_DATA;
- TxMessage.IDE = CAN_ID_EXT;
- TxMessage.DLC = Check_Number(Cmd[10]);
- TxMessage.ExtId = 0;
- for (i = 0; i < 8; i++)
- {
- TxMessage.ExtId |= (u32)Check_Number(Cmd[12+i])<<4*(7-i);
- }
- for(i = 0;i < TxMessage.DLC;i++)
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
完整代碼:
CANBUSV1.3程序.rar
(1.56 MB, 下載次數(shù): 32)
2017-4-26 08:51 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|