CH376讀的時候一次只能讀27個字符,寫只能寫30個及30個以下的字符

如題 用51單片機(W79E227)的異步串口方式(串口1)

如果 i值28,29,30,31的時候 能讀出來28個字符,且不報錯順利通過 如果i值不為這幾個數(shù),則要么等待時間特別長(8s左右),要么返回FA超時 一般情況下,小于27的數(shù)等待時間特別長,但能讀出來,大于32的數(shù),返回FA超時,屏蔽掉報錯程序mStopIfError( s );后,同樣只可以讀出來28個字節(jié)的數(shù)據(jù)

打開文件成功后 s = CH376ByteRead(buf, i, &RealCount ); mStopIfError( s );

另外寫的時候 buf里面裝的數(shù)超過30個的時候就會返回FA超時

新建文件成功后 strcpy( buf, "a1" ); s =CH376ByteWrite( buf, strlen( buf ), NULL ); mStopIfError( s ); 我用的異步串口的方式,改中斷等待時間沒用,該波特率也沒用

可能是什么地方出了錯?或者是說這個函數(shù)本來就是這樣 CH376ByteWrite

CH376ByteRead 都是網(wǎng)站上下載的程序 UINT8 CH376ByteRead( PUINT8 buf, UINT16 ReqCount, PUINT16 RealCount ) /* 以字節(jié)為單位從當(dāng)前位置讀取數(shù)據(jù)塊 */ { UINT8 s; xWriteCH376Cmd( CMD2H_BYTE_READ ); xWriteCH376Data( (UINT8)ReqCount ); xWriteCH376Data( (UINT8)(ReqCount>>8) ); // xEndCH376Cmd( ); if ( RealCount ) *RealCount = 0; while ( 1 ) { s = Wait376Interrupt( ); if ( s == USB_INT_DISK_READ ) { // s = CH376ReadBlock( buf ); /* 從當(dāng)前主機端點的接收緩沖區(qū)讀取數(shù)據(jù)塊,返回長度 */ if ( *(PUINT8)&buf ) s = CH376ReadBlockX( buf ); /* 外部RAM */ else s = CH376ReadBlockI( buf ); /* 內(nèi)部RAM */ xWriteCH376Cmd( CMD0H_BYTE_RD_GO ); // xEndCH376Cmd( ); buf += s; if ( RealCount ) *RealCount += s; } /* else if ( s == USB_INT_SUCCESS ) return( s );*/ /* 結(jié)束 */ else return( s ); /* 錯誤 */ } }

UINT8 CH376ByteWrite( PUINT8 buf, UINT16 ReqCount, PUINT16 RealCount ) /* 以字節(jié)為單位向當(dāng)前位置寫入數(shù)據(jù)塊 */ { UINT8 s; xWriteCH376Cmd( CMD2H_BYTE_WRITE ); xWriteCH376Data( (UINT8)ReqCount ); xWriteCH376Data( (UINT8)(ReqCount>>8) ); // xEndCH376Cmd( ); if ( RealCount ) *RealCount = 0; while ( 1 ) { s = Wait376Interrupt( ); if ( s == USB_INT_DISK_WRITE ) { // s = CH376WriteReqBlock( buf ); /* 向內(nèi)部指定緩沖區(qū)寫入請求的數(shù)據(jù)塊,返回長度 */ if ( *(PUINT8)&buf ) s = CH376WriteReqBlockX( buf ); /* 外部RAM */ else s = CH376WriteReqBlockI( buf ); /* 內(nèi)部RAM */ xWriteCH376Cmd( CMD0H_BYTE_WR_GO ); // xEndCH376Cmd( ); buf += s; if ( RealCount ) *RealCount += s; } /* else if ( s == USB_INT_SUCCESS ) return( s );*/ /* 結(jié)束 */ else return( s ); /* 錯誤 */ } }

另外一個問題:命令里面有一個“繼續(xù)枚舉文件”,也就是枚舉下一個文件,那要是想枚舉上一個文件該怎么辦

1. 需要看一下 完整的工程 2. 可以繼續(xù)往下枚舉,不可以往上枚舉。 可以重新枚舉


重新枚舉的命令是什么?


CH376SetFileName( "\\*" ); /* 設(shè)置將要操作的文件的文件名,通配符支持所有文件和子目錄 */ xWriteCH376Cmd( CMD0H_FILE_OPEN ); /* 枚舉文件和目錄 */


我測試了一下 發(fā)現(xiàn)原因是, CH376ByteRead函數(shù)中的 CH376ReadBlock函數(shù)中的

xWriteCH376Cmd( CMD01_RD_USB_DATA0 ); s = l = xReadCH376Data( );

這個s的值為0x1d (表示請求數(shù)據(jù)輸出),十進制即為29 所以 無論每次要求讀多少個字,以下的語句 都是按照 29次來循環(huán),導(dǎo)致每次只能讀29個字節(jié)的情況,請問這種情況怎么解釋 if ( l ) { do { *buf = xReadCH376Data( ); buf ++; } while ( -- l ); }


0x1d是一個中斷狀態(tài),可能是CH376之前返回給單片機的中斷狀態(tài)沒有取走,一直保存在單片機的接收SBUF中, 該下面的程序試試 /* 查詢CH376中斷(INT#低電平) */ UINT8 Query376Interrupt( void ) { unsigned char dat; if ( RI_1 ) ////串口接收標(biāo)志,串口接收到數(shù)據(jù) { dat = SBUF1; //將CH376返回給單片機的中斷狀態(tài)取走,相當(dāng)清SBUF RI_1 = 0; //清串口標(biāo)志 RI_1 = 0; //清串口標(biāo)志 return( TRUE ); } else return( FALSE );

}


方法可行,此 問題已解決


讀字節(jié)的過程是沒錯了 ,但是枚舉的時候出問題了


枚舉的程序請參考CH376EVT.ZIP里面的 EXAM13


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频