若干问题求解,谢谢帮忙的店小儿,剪刀妹,小小何
一 ch375U盘读写模块的应用程序中外部命令打开文件时需要加mCmdParam.Open.mPathName命令以及文件路径,但是不明白strcpy(mCmdParam.Open.mPathName,\\..\\..)这个结构。而且在并口+查询(扇区读写)的示冽程序中怎么又换成了memcpy(mCmdParam.Open.mPathName,\\..\\..)

二 上次我发贴说自己用字节读写模式所以改动了ExecCommand子程序, 剪刀妹说不用修改,只是主程序中调用不同外部命令就行。但我不明白的是如果是扇区读示例程序中的子程序是把数据存储在idata的buf里,并没有提及往mCmdParam.Other.mBuffer里放数据,那么我用字节读写不改子程序的话,在主程序里byteread后从哪里取数据呢?

三 是不是读写的文件名一定要大写?另外我用传口调试助手接受单片机串口数据,那么程序中的printf("%C", mCmdParam.ByteRead.mByteBuffer[i])能把数据成功的输送到串口么?

四 还有很多问题没想好。我做这个ch375U盘读写模块在单片机上作简单读写功能已经做了快2个月了, 单片机从c814到c8051f20,始终没有进展,每次调试都是U盘读写模块LED始终的亮着,又不知道问提出在哪里?虽然说是还没入门的新人,带我的工程师对我的进度还是表现出十分的不满了。我真的也是很惭愧连这点小事都要做这么久........
最后还是恳求你们能仔细看看我的程序么,让我也知道错误出在哪里,从哪里去着手更正。谢谢
我用在程序里的子程序,恳求达人能耐心看完指点出错误
unsigned char ExecCommand( unsigned char cmd, unsigned char len )

{
unsigned char i, k, status;

CH375HM_INDEX = 0;
CH375HM_DATA = cmd;
CH375HM_DATA = len;

if( len ){
for(i=0;i!=len;i++)
{
CH375HM_DATA = mCmdParam.Other.mBuffer[ i ];
}
}

CH375HM_STA = 0;
CH375HM_STA = 0;
CH375HM_STA = 0;
CH375HM_STA = 0;
CH375HM_STA = 0;
CH375HM_STA = 1;

while ( 1 )
{
while ( CH375HM_INT_WIRE );
CH375HM_INDEX = 63;
status = CH375HM_DATA;
CH375HM_INDEX = 0; /* 中断应答 */
CH375HM_DATA = 0; /* 向索引地址0写入无效命令码0,取消中断请求 */
if ( status == ERR_SUCCESS )
{
CH375HM_INDEX = 1;
i= CH375HM_DATA;

if ( i ) {
k = 0;
do {
mCmdParam.Other.mBuffer[ k ] = CH375HM_DATA;
k++;
} while ( --i );
}
break;
}

else if ( status == USB_INT_DISK_READ || status == USB_INT_DISK_WRITE || status == USB_INT_DISK_RETRY )
{
break;
}
else {

if ( status == ERR_DISK_DISCON || status == ERR_USB_CONNECT )
mDelaymS( 200 );
break;
}

while( CH375HM_INT_WIRE == 0 );
}
return( status );
}


主程序就是读read目录下hi文本文件中的“itisfun”,很简单我却举步维艰
main( ) {
unsigned char i;


sysclk_init( );
cross_switch( );
uart0_init ( );

LED_OUT = 0;
mDelaymS( 200 );
mDelaymS( 200 );
LED_OUT = 1;
printf( "Start\n" );

while ( 1 ) {
printf( "Wait Udisk\n" );
while ( 1 ) {
i = ExecCommand( CMD_QueryStatus, 0 );
mStopIfError( i );
if ( mCmdParam.Status.mDiskStatus >= DISK_CONNECT ) break;
mDelaymS( 200 );
}
mDelaymS( 200 );
LED_OUT = 0;

for ( i = 0; i < 5; i ++ ) {
mDelaymS( 200 );
printf( "Ready ?\n" );
if ( ExecCommand( CMD_DiskReady, 0 ) == ERR_SUCCESS ) break;
}

printf( "Open\n" );
strcpy( mCmdParam.Open.mPathName, "\\READ\\HI.TXT");
i = ExecCommand( CMD_FileOpen, MAX_PATH_LEN );
if ( i == ERR_MISS_DIR || i == ERR_MISS_FILE ) {
printf("filemiss\n"); }

else {
mStopIfError( i );
printf("read\n");
mCmdParam.ByteRead.mByteCount = 5;
i = ExecCommand( CMD_ByteRead, 1 );
mStopIfError( i );
for(i=0; i!=mCmdParam.ByteRead.mByteCount;i++) printf("%C", mCmdParam.ByteRead.mByteBuffer[i]);
printf("\n");
mCmdParam.ByteRead.mByteCount = 20;
i = ExecCommand( CMD_ByteRead, 1 );
mStopIfError( i );
for(i=0; i!=mCmdParam.ByteRead.mByteCount;i++) printf("%C", mCmdParam.ByteRead.mByteBuffer[i]);
if(mCmdParam.ByteRead.mByteCount<20) printf("end\n");
printf("close\n");
mCmdParam.Close.mUpdateLen = 0;
i = ExecCommand( CMD_FileClose, 1 );
mStopIfError( i );
}



printf( "Take_out\n" );
while ( 1 ) {
i = ExecCommand( CMD_QueryStatus, 0 );
mStopIfError( i );
if ( mCmdParam.Status.mDiskStatus <= DISK_DISCONNECT ) break;
mDelaymS( 200 );
}
LED_OUT = 1;
}
}

你把完整的程序以附件的新式贴上来吧!这样好看些!

一.memcpy和strcpy是两个不同的字符串操作函数,在C51的库里面,不同的是memcpy要指定复制的长度,
而strcpy是复制字符串,直到最后一个是\0时停止,.
二.字节操作返回的状态是ERR_SUCCESS然后返回的数据在mCmdParam.Other.mBuffer中,而扇区操作返回的状态是USB_INT_DISK_READ和USB_INT_DISK_WRITE,数据在*buffer中,在一次扇区操作数据传完后再返回状态ERR_SUCCESS.
三.读写的文件名一定要是大写的.printf("%s", mCmdParam.ByteRead.mByteBuffer),可能可以.
四.操作模块其实,你拿例子程序,不用修改任何地方,如果你用C8051F的话,串口输出调试信息,那里对串口的初始化,可能要改动一下,然后你把模块挂在单片机的总线上,关键地址要定对,挂模块就象扩展RAM一样,另外命令口数据口地址不要弄倒了,还有你的C8051F速度比较快,将MOVX指令,周期改长一点,保证操作时序.那么问题肯定很快解决.
要实在不行,那你把模块设置成串口,然后用你的单片机串口,操作模块,拿例子程序试一下,先满足一下,增加点信心,也行..

看一下

PUSH

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