CH375数据交互问题

1、CH372做的适配器;接收的时候缓冲区模式接收,发送的时候直接发送; 发送一帧 14字节,接收一帧16字节; 当发送速度过快(发送与发送直接没有暂停)会出现适配器假死的现象; 请问如何解决? 2、如果开辟下传缓冲区的话,工作机制是如何,每帧长度如何设置; 3、亲问CH372如果假死了要如何处理。 4、麻烦您推荐一种方式实现上传下发尔适配器不假死,并且不用暂停(sleep); 希望帮忙解答。万分感谢

你发完一帧数据后,等数据被取走后再发下一帧的数据,接收也是这样的过程


发送过程中如何判断这一帧是否被取走?


您好,请问如何在上位机判断发送的帧已被取走(发送成功)。


如果大批量传输数据时,下位机最好是56(14*4)一传,还有下位机必须等上包传完再传下一包,CH375ReadData这个函数一次去读4088(73*56,最大支持4096,用缓冲上传模式时必须要包的整数倍读取)。关于假死的情况,最好避免读写同时进行的情况,下位机在处理一个中断时,禁止其他USB中断,退出时再开启中断


万分改写您的帮助,我改下程序;有什么问题在求教!


您好,我按照您说的,在处理中断时将USB中断关闭,退出时打开,但是问题依然存在; 正是您所说的发送影响了接收; 单独测试发送 和接收都没有问题,但是同时进行适配器卡死; 但是适配器要满足同时发送与接收,全速发送的时候出现卡死现象,发送与发送之间sleep(1)无卡死现象;但是实时性达不到要求; 个人认为上位机发送太快,下位机接收和发送中断打架了,下位机中断来不及处理,请问上位机如何知道我这一帧发送完毕,然后发送下一帧。


你说的适配器卡死是指下位机卡死还是上位机死了?你把你的上位机下位机代码都发过来,我们帮你看一下。


下位机卡死了进不了中断了


下位机 中断部分 void UsbInput(void) { unsigned char InterruptStatus; unsigned char i; unsigned char cache2; unsigned char Rec=2; //上位机发送标志 CanSendPCflag2 =0; //关中断 _asm("FCLR I"); kupic = 0x00; _asm("FSET I"); kaiguan=1;

CH375_WR_CMD_PORT( CMD_GET_STATUS ); //获取中断状态并取消中断请求 InterruptStatus = CH375_RD_DAT_PORT( ); // 获取中断状态 switch ( InterruptStatus ) { //分析中断状态处理 case USB_INT_EP2_OUT: { // 批量端点下传成功 CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); // 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 RecLight = CH375_RD_DAT_PORT( ); // 首先读取后续数据长度 for ( i = 0; i < RecLight; i ++ ) { buffer[i] = CH375_RD_DAT_PORT( ); } //添加缓冲区 cpm(); break; } case USB_INT_EP2_IN: { // 批量数据发送成功 CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); //释放当前USB缓冲区 break; } case USB_INT_EP1_IN: { CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); //释放当前USB缓冲区 UsbOn; // qingkong=0; break; } default: { // 其它中断,未用到,解锁后退出即可 CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); // 释放当前USB缓冲区 break; } } CanSendPCflag2=1; //开USB中断 _asm("FCLR I"); kupic = 0x06; _asm("FSET I"); kaiguan=2; // OpenCloseUsb(1); } //--------------------------------------------------------------------------------------- //解析数据 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数据 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数据 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; } } 适配器收发 //----------------------------------------------------------------------------------------- //适配器收发 //缓冲区 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的发送部分 //打开K中断 } if(UsbRFlag>=1 && UsbRFlag>UsbSendFlag && (UsbRFlag- UsbSendFlag)<= 200 ) { //发送 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发送 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++; //如果游标溢出停止 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适配器测试软件,还有下位机(HEW编译器),打包发送到您邮箱了,麻烦您帮忙看下一下万分感谢。


给你回邮件了,看邮件。


你的下位机程序太乱,注释也不清楚,你讲下你的流程


问题解决,给力!吼一下。


楼上应该把解决办法贴出来了!这样方便大家交流啊!


只有登录才能回复,可以选择微信账号登录