用扇区写命令往u盘中写数据,buffer中的数据是00和FF交替,可为什么u盘中的数据是这样的呢? 程序是这样的:
……
j=0; for(i=0;i<4096;i++) { buf[i]= j; j=~j; }
……
for(i=0;i<2;i++) { s=CH376SecWrite( buf, 8, NULL ); mStopIfError( s ); } s = CH376FileClose( TRUE ); mStopIfError( s );
……
用扇区写命令往u盘中写数据,buffer中的数据是00和FF交替,可为什么u盘中的数据是这样的呢? 程序是这样的:
……
j=0; for(i=0;i<4096;i++) { buf[i]= j; j=~j; }
……
for(i=0;i<2;i++) { s=CH376SecWrite( buf, 8, NULL ); mStopIfError( s ); } s = CH376FileClose( TRUE ); mStopIfError( s );
……
请用ultraedit打开,上面的文件,也可以看这里的图片:UploadImages/20126211421132.rar
文件中的内容如下:
00 80 02 02 1F 00 00 00 48 49 59 41 20 20 20 20; ....HIYA 55 42 20 46 6C 61 73 68 20 20 44 69 73 6B 20 25; UB Flash Disk % 7A 21 59 59 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF; z!YY. . . . . . . 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF; . . . . . . . . . 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF; . . . . . . . . . …… …… 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF; . . . . . . . . . 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF; . . . . . . . . . 00 80 02 02 1F 00 00 00 48 49 59 41 20 20 20 20; ....HIYA 55 42 20 46 6C 61 73 68 20 20 44 69 73 6B 20 25; UB Flash Disk % 7A 21 59 59 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF; z!YY. . . . . . . 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF; . . . . . . . . . 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF; . . . . . . . . . …… …… 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF; . . . . . . . . . 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF; . . . . . . . . .
文件中每次调用写命令CH376SecWrite( buf, 8, NULL ); 便会出现: 00 80 02 02 1F 00 00 00 48 49 59 41 20 20 20 20; ....HIYA 55 42 20 46 6C 61 73 68 20 20 44 69 73 6B 20 25; UB Flash Disk % 7A 21 59 59 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF; z!YY. . . . . . 以这些数据开头的数据,请问是怎么回事?
好像是我的u盘数据,因为我的u盘是HIYA牌的。
但是这样的话,我写了2次CH376SecWrite( buf, 8, NULL );的数据就不是完整的,因为我程序中的数据完全是00和FF,如果把上面这些数据都变成00和FF的话,数据就是完整的,正好是8k字节,可是这些数据是怎么回事呢?
烦请大侠指点。谢谢!
这肯定是你的缓冲区有问题。 这个很好实验,你在每次写数据的时候都去重新初始化一下缓冲区。这个数据 肯定是你写进去的。 CH376初始化会获取这个36字节的数据,是否在U盘初始话之前初始化的缓冲区?然后后面有被其他函数使用这个缓冲区了? 把你的函数贴出来
Udisk( ) { UINT16 i, s,j; P_FAT_DIR_INFO pDir; UINT8 TarName[64]; mDelaymS( 100 ); /* 延时100毫秒 */
puts( "Start\n" );
s = mInitCH376Host( ); /* 初始化CH376 */ mStopIfError( s );
puts( "Wait Udisk/SD\n" ); while ( CH376DiskConnect( ) != USB_INT_SUCCESS ) { mDelaymS( 100 ); } mDelaymS( 200 ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */
for ( i = 0; i < 100; i ++ ) { /* 最长等待时间,100*50mS */ mDelaymS( 50 ); puts( "Ready ?\n" ); s = CH376DiskMount( ); /* 初始化磁盘并测试磁盘是否就绪 */ if ( s == USB_INT_SUCCESS ) break; /* 准备好 */ else if ( s == ERR_DISK_DISCON ) break; /* 检测到断开,重新检测并计时 */ if ( CH376GetDiskStatus( ) >= DEF_DISK_MOUNTED && i >= 5 ) break; /* 有的U盘总是返回未准备好,不过可以忽略,只要其建立连接MOUNTED且尝试5*50mS */ } if ( s == ERR_DISK_DISCON ) { /* 检测到断开,重新检测并计时 */ puts( "Device gone\n" ); }
j=0; for(i=0;i<512;i++) { buffer[i]= j; j=~j; }
strcpy( TarName, "\TEST.PCM" );
puts( "Create\n" ); s = CH376FileCreate( TarName ); mStopIfError( s );
puts( "Write\n" );
temp=0; while(1){ s=CH376SecWrite( buffer, 1, NULL ); temp++; if(temp==4)break; }
s=CH376SecWrite( buffer, 0, NULL ); /* 写0长度,实际是刷新文件长度,将CH376内存中当前文件长度信息真正写入U盘或者SD卡中 */ mStopIfError( s );
puts( "Close\n" );
上面是我的代码,根据红桃六老师的建议,我仔细看了一下缓冲区,确实存在问题,我又修改了一下代码,如楼上所示。
前面的36个字节的数据,现在还是会出现: 00 80 02 02 1F 00 00 00 48 49 59 41 20 20 20 20; ....HIYA 55 42 20 46 6C 61 73 68 20 20 44 69 73 6B 20 25; UB Flash Disk % 7A 21 59 59 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF; z!YY. . . . . . …… 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF; . . . . . . . . . 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF; . . . . . . . . .
现在我是总共写4个扇区,每次写一个扇区,写4次。 现在的情况是:整个文件2KB数据中,最前面的36个字节还是会出现,只不过现在只出现一次,请问这是哪里的问题?
烦请红桃六老师再帮忙看看。谢谢!
for(i=0;i<512;i++) { buffer= j; j=~j; }
这是什么意思?慢慢来。自己好好查查吧。如果把解决问题的希望寄托给别人,总会产生依赖感。你犯了很多粗心的错误。