1、CH372做的適配器;接收的時(shí)候緩沖區(qū)模式接收,發(fā)送的時(shí)候直接發(fā)送; 發(fā)送一幀 14字節(jié),接收一幀16字節(jié); 當(dāng)發(fā)送速度過快(發(fā)送與發(fā)送直接沒有暫停)會(huì)出現(xiàn)適配器假死的現(xiàn)象; 請(qǐng)問如何解決? 2、如果開辟下傳緩沖區(qū)的話,工作機(jī)制是如何,每幀長度如何設(shè)置; 3、親問CH372如果假死了要如何處理。 4、麻煩您推薦一種方式實(shí)現(xiàn)上傳下發(fā)爾適配器不假死,并且不用暫停(sleep); 希望幫忙解答。萬分感謝
你發(fā)完一幀數(shù)據(jù)后,等數(shù)據(jù)被取走后再發(fā)下一幀的數(shù)據(jù),接收也是這樣的過程
發(fā)送過程中如何判斷這一幀是否被取走?
您好,請(qǐng)問如何在上位機(jī)判斷發(fā)送的幀已被取走(發(fā)送成功)。
如果大批量傳輸數(shù)據(jù)時(shí),下位機(jī)最好是56(14*4)一傳,還有下位機(jī)必須等上包傳完再傳下一包,CH375ReadData這個(gè)函數(shù)一次去讀4088(73*56,最大支持4096,用緩沖上傳模式時(shí)必須要包的整數(shù)倍讀取)。關(guān)于假死的情況,最好避免讀寫同時(shí)進(jìn)行的情況,下位機(jī)在處理一個(gè)中斷時(shí),禁止其他USB中斷,退出時(shí)再開啟中斷
萬分改寫您的幫助,我改下程序;有什么問題在求教!
您好,我按照您說的,在處理中斷時(shí)將USB中斷關(guān)閉,退出時(shí)打開,但是問題依然存在; 正是您所說的發(fā)送影響了接收; 單獨(dú)測試發(fā)送 和接收都沒有問題,但是同時(shí)進(jìn)行適配器卡死; 但是適配器要滿足同時(shí)發(fā)送與接收,全速發(fā)送的時(shí)候出現(xiàn)卡死現(xiàn)象,發(fā)送與發(fā)送之間sleep(1)無卡死現(xiàn)象;但是實(shí)時(shí)性達(dá)不到要求; 個(gè)人認(rèn)為上位機(jī)發(fā)送太快,下位機(jī)接收和發(fā)送中斷打架了,下位機(jī)中斷來不及處理,請(qǐng)問上位機(jī)如何知道我這一幀發(fā)送完畢,然后發(fā)送下一幀。
你說的適配器卡死是指下位機(jī)卡死還是上位機(jī)死了?你把你的上位機(jī)下位機(jī)代碼都發(fā)過來,我們幫你看一下。
下位機(jī)卡死了進(jìn)不了中斷了
下位機(jī) 中斷部分 void UsbInput(void) { unsigned char InterruptStatus; unsigned char i; unsigned char cache2; unsigned char Rec=2; //上位機(jī)發(fā)送標(biāo)志 CanSendPCflag2 =0; //關(guān)中斷 _asm("FCLR I"); kupic = 0x00; _asm("FSET I"); kaiguan=1;
CH375_WR_CMD_PORT( CMD_GET_STATUS ); //獲取中斷狀態(tài)并取消中斷請(qǐng)求 InterruptStatus = CH375_RD_DAT_PORT( ); // 獲取中斷狀態(tài) switch ( InterruptStatus ) { //分析中斷狀態(tài)處理 case USB_INT_EP2_OUT: { // 批量端點(diǎn)下傳成功 CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); // 從當(dāng)前USB中斷的端點(diǎn)緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) RecLight = CH375_RD_DAT_PORT( ); // 首先讀取后續(xù)數(shù)據(jù)長度 for ( i = 0; i < RecLight; i ++ ) { buffer[i] = CH375_RD_DAT_PORT( ); } //添加緩沖區(qū) cpm(); break; } case USB_INT_EP2_IN: { // 批量數(shù)據(jù)發(fā)送成功 CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); //釋放當(dāng)前USB緩沖區(qū) break; } case USB_INT_EP1_IN: { CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); //釋放當(dāng)前USB緩沖區(qū) UsbOn; // qingkong=0; break; } default: { // 其它中斷,未用到,解鎖后退出即可 CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); // 釋放當(dāng)前USB緩沖區(qū) break; } } CanSendPCflag2=1; //開USB中斷 _asm("FCLR I"); kupic = 0x06; _asm("FSET I"); kaiguan=2; // OpenCloseUsb(1); } //--------------------------------------------------------------------------------------- //解析數(shù)據(jù) void cpm(void) { unsigned char FlagLin; unsigned char cache1; unsigned long mgr; unsigned short mar,mbr; unsigned char dd[4]; unsigned char Delay; switch (buffer[0]) { case CMD01: SetFLag=2; //命令 if(buffer[1]==0)//can { mgr=(((unsigned long )buffer[3])<<24)|(((unsigned long )buffer[4])<<16)|(((unsigned long )buffer[5])<<8)|buffer[6]; mar=(((unsigned long )buffer[7])<<8)|buffer[8]; mbr=(((unsigned long )buffer[9])<<8)|buffer[10]; can_initial(buffer[2],mgr,mar,mbr); dd[0]=2; dd[1]=0; dd[2]=1; _asm("FCLR I"); kupic = 0x06; _asm("FSET I"); CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); UsbSend(dd,3); } else if(buffer[1]==1) { // _asm("FCLR I"); dd[0]=2; dd[1]=1; dd[2]=1; _asm("FCLR I"); kupic = 0x06; _asm("FSET I"); CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); UsbSend(dd,3); // _asm("FSET I"); } else if(buffer[1]==5) { return; } else if(buffer[1]==6) { SetFLag=1; } else { // _asm("FCLR I"); dd[0]=2; dd[1]=buffer[1]; dd[2]=0; _asm("FCLR I"); kupic = 0x06; _asm("FSET I"); CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); UsbSend(dd,3); // _asm("FSET I"); return; } SetFLag=1; break; case CMD02: //Can數(shù)據(jù) cache1= (unsigned char )UsbRFlag&0xff; for(FlagLin=0;FlagLin { CacheUsb[cache1][FlagLin+6]=buffer[FlagLin+6]; } CacheUsb[cache1][5]=buffer[5]; CacheUsb[cache1][0]=0; CacheUsb[cache1][1]=buffer[1]; CacheUsb[cache1][2]=buffer[2]; CacheUsb[cache1][3]=buffer[3]; CacheUsb[cache1][4]=buffer[4]; UsbOn; UsbRFlag++; break; case CMD03: //Lin數(shù)據(jù) cache1= UsbRFlag&0xff; for(FlagLin=0;FlagLin { CacheUsb[cache1][FlagLin+6]=buffer[FlagLin+6]; } CacheUsb[cache1][5]=RecLight-1-5; CacheUsb[cache1][0]=1; CacheUsb[cache1][1]=buffer[1]; CacheUsb[cache1][2]=buffer[2]; CacheUsb[cache1][3]=buffer[3]; CacheUsb[cache1][4]=buffer[4]; UsbOn; UsbRFlag++; break; } } 適配器收發(fā) //----------------------------------------------------------------------------------------- //適配器收發(fā) //緩沖區(qū) void SendAndRecive(void) {
can_std_data_def data_frame; unsigned char icache2; unsigned char cache1; unsigned char cache2; unsigned int icache; unsigned int i;
if (SetFLag==1) { if(CanLinRFlag>=1 && CanLinRFlag>CanLinSFlag && (CanLinRFlag- CanLinSFlag)<= 255) { if( CanSendPCflag2==1) { // i=100; // while(i--); CanSendPCflag2=0; cache2=CanLinSFlag &0xff; if (kaiguan==1) {;} else { UsbSend(CanLinCache[cache2],16); CanLinSFlag++; } } } else if(CanLinRFlag-CanLinSFlag >255) { CanLinRFlag=0; CanLinSFlag=0; } //CAN與Lin的發(fā)送部分 //打開K中斷 } if(UsbRFlag>=1 && UsbRFlag>UsbSendFlag && (UsbRFlag- UsbSendFlag)<= 200 ) { //發(fā)送 qingkong=0; cache1=UsbSendFlag&0xff; if(CacheUsb[cache1][0]==1) { //繁忙等待 while(kaiguan2==1); LinOn; text_write(CacheUsb[cache1],CacheUsb[cache1][8]); } else if(CacheUsb[cache1][0]==0) { //Can發(fā)送 data_frame.id = ((unsigned long)CacheUsb[cache1][1]<<24)|((unsigned long)CacheUsb[cache1][2]<<16)|((unsigned long)CacheUsb[cache1][3]<<8)|CacheUsb[cache1][4]; data_frame.dlc = CacheUsb[cache1][5]&0xf; for(icache2=0;icache2 { data_frame.data.data[icache2]=CacheUsb[cache1][icache2+6]; } set_trm_std_dataframe_can0( 0, &data_frame,(CacheUsb[cache1][5]>>4)&0x01,(CacheUsb[cache1][5]>>5)&0x01); CanOn; } UsbSendFlag++; //如果游標(biāo)溢出停止 if(UsbRFlag>=4000000000) { UsbRFlag=0; UsbSendFlag=0; } } else if((UsbRFlag - UsbSendFlag) > 200|| UsbRFlag < UsbSendFlag) { UsbRFlag=0; UsbSendFlag=0; } else if(UsbRFlag==UsbSendFlag ) { kongpao++; if (kongpao>=10000) { kongpao=0; UsbOff; LinOff; CanOff; } }
}
您好,我把我寫的DLL庫,VB適配器測試軟件,還有下位機(jī)(HEW編譯器),打包發(fā)送到您郵箱了,麻煩您幫忙看下一下萬分感謝。
給你回郵件了,看郵件。
你的下位機(jī)程序太亂,注釋也不清楚,你講下你的流程
問題解決,給力!吼一下。
樓上應(yīng)該把解決辦法貼出來了!這樣方便大家交流??!