项目中用到CH375写TXT,//查询CH375中断并更新中断状态,等待U盘插入时容易出现假死,不知道怎么解决
你所说的假死是什么意思?是不是中断引脚没有拉低?
case 0X31: check=CH375DiskConnect();//查询CH375中断并更新中断状态,等待U盘插入 Com_Data[0X00]=0X0A; Com_Data[0X01]=0X31; Com_Data[0X02]=Ascii[(check>>4)&0X0F]; Com_Data[0X03]=Ascii[check&0X0F]; check=Com_Data[0X00]^Com_Data[0X01]^Com_Data[0X02]^Com_Data[0X03]; Com_Data[0X04]=Ascii[(check>>4)&0X0F]; Com_Data[0X05]=Ascii[check&0X0F]; Com_Data[0X06]=0X0D; for(i=0X00;i<0X07;i++) { Send_Data(Com_Data[i]); } break;看程序,当我收到 0X31的时候 ();//查询CH375中断并更新中断状态,等待U盘插入 这一步,刚用示波器看了,假死的时候中断引脚没有拉低
这个时候U盘是刚插入到CH375里面的吗?你可以看下CH375的ACT#引脚为高还是为低?
为点平
低电平
那有可能你前面获取到了设备连接,后面在获取的时候check变量值为0X14?那么需要看下CH375DiskStatus这个变量值是多少?
我把操作速度降下来好像可以了,但是持续写一段时间又像假死状态 500毫秒写一次
我的QQ442502587,可以打电话吗
case 0X36: mCopyCodeStringToIRAM(mCmdParam.Open.mPathName,"/RECORD.TXT"); // 文件名,该文件在根目录下 check=CH375FileOpen(); //打开文件 if(check==ERR_SUCCESS) { mCmdParam.ByteLocate.mByteOffset=0xffffffff; // 移到文件的尾部 check=CH375ByteLocate(); if(check==ERR_SUCCESS) { for(i=0X02;i<26;i++) { Com_Data[i]=Ascii_To_Hex(Com_Data[i]); }
for(i=0X02;i<25;i=i+2) { Com_Data[i]=Com_Data[i]<<4; Com_Data[i]=Com_Data[i]|Com_Data[i+0X01]; }
index=sprintf(mCmdParam.ByteWrite.mByteBuffer,"%02d,%02d,%02d,%02d,",(UINT16)Com_Data[0X02],(UINT16)Com_Data[0X04],(UINT16)Com_Data[0X06],(UINT16)Com_Data[0X08]); mCmdParam.ByteWrite.mByteCount=(unsigned char)index; check=CH375ByteWrite();
index=sprintf(mCmdParam.ByteWrite.mByteBuffer,"%02d-%02d-%02d,",(UINT16)Com_Data[0X0A],(UINT16)Com_Data[0X0C],(UINT16)Com_Data[0X0E]); mCmdParam.ByteWrite.mByteCount=(unsigned char)index; check=CH375ByteWrite();
index=sprintf(mCmdParam.ByteWrite.mByteBuffer,"%02d:%02d:%02d,%02d,",(UINT16)Com_Data[0X10],(UINT16)Com_Data[0X12],(UINT16)Com_Data[0X14],(UINT16)Com_Data[0X16]); mCmdParam.ByteWrite.mByteCount=(unsigned char)index; check=CH375ByteWrite();
index=sprintf(mCmdParam.ByteWrite.mByteBuffer,"%02d\xd\xa",(UINT16)Com_Data[0X18]); mCmdParam.ByteWrite.mByteCount=(unsigned char)index; check=CH375ByteWrite(); //index=sprintf(mCmdParam.ByteWrite.mByteBuffer,"%02d%02d%02d%02d,%02d-%02d-%02d %02d:%02d:%02d,%02d\xd\xa", //(UINT16)Com_Data[0X02],(UINT16)Com_Data[0X04],(UINT16)Com_Data[0X06],(UINT16)Com_Data[0X08], //(UINT16)Com_Data[0X0A],(UINT16)Com_Data[0X0C],(UINT16)Com_Data[0X10],(UINT16)Com_Data[0X12], //(UINT16)Com_Data[0X14],(UINT16)Com_Data[0X16],(UINT16)Com_Data[0X18]); // 将二制制数据格式为一行字符串 //mCmdParam.ByteWrite.mByteCount=(unsigned char)index; // 指定本次写入的字节数,不能超过MAX_BYTE_IO,否则另用缓冲区分多次写入 //check=CH375ByteWrite(); //以字节为单位向文件写入数据,单次读写的长度不能超过MAX_BYTE_IO
mCmdParam.Close.mUpdateLen=1; //自动计算文件长度,以字节为单位写文件,建议让程序库关闭文件以便自动更新文件长度 i=CH375FileClose(); //关闭文件 } }
Com_Data[0X00]=0X0A; Com_Data[0X01]=0X36; Com_Data[0X02]=Ascii[(check>>4)&0X0F]; Com_Data[0X03]=Ascii[check&0X0F]; check=Com_Data[0X00]^Com_Data[0X01]^Com_Data[0X02]^Com_Data[0X03]; Com_Data[0X04]=Ascii[(check>>4)&0X0F]; Com_Data[0X05]=Ascii[check&0X0F]; Com_Data[0X06]=0X0D; for(i=0X00;i<0X07;i++) { Send_Data(Com_Data[i]); }
break;假死转台发生后,我拔下优盘会收到for(i=0X00;i<0X07;i++) { Send_Data(Com_Data[i]); }
回复的数据,说明程序一直卡在前面,是不是什么地方有while循环
如果出现死机的情况唯一可以停在库里面的只有是等中断函数。你用的接口是什么接口?模拟并口还是其他的接口?
单片机是STC89C52
那你单片机的具体资源说下,还有你有没有外扩RAM以及单片机自己自带RAM有多少?问题是并口还是串口连接? 还有就是如果是并口连接,那么是模拟并口还是总线接口?
单片机的Sram是1280字节 没有外扩RAM 是总线并口,我将电路发到你邮箱吧
硬件看了没问题。你把你软件发到我邮箱我帮你看下是否有问题。如果可以最好是一个工程文件。
在打扰一下,更新了库之后连续写1000多行之后出现假死 拔掉优盘后错误代码是B4 表示文件已经关闭,会不会是变量溢出了,,