請問當一次寫入大于30個字符,函數(shù)CH376WriteReqBlock(buf)返回長度異常

大家好!

最近我在用CH376芯片連接USB寫TXT數(shù)據(jù),但是無論是中斷原地等待還是中斷定時查詢方式,有問題的都是一個地方,出現(xiàn)在ByteWrite在返回長度上。

UINT8CH376ByteWrite(PUINT8 buf, UINT16 ReqCount, PUINT16 RealCount)? /* 以字節(jié)為單位向當前位置寫入數(shù)據(jù)塊 */

{

UINT8s;

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ù)塊,返回長度 */

xWriteCH376Cmd(CMD0H_BYTE_WR_GO) ;

xEndCH376Cmd() ;

buf += s;

if (RealCount) *RealCount += s;

}

/*else if (s == USB_INT_SUCCESS) return(s) ;*/? /* 結(jié)束 */

else return(s) ;? /* 錯誤 */

}

}

我根據(jù)上面這個例程中的函數(shù),轉(zhuǎn)化移植到我的單片機中,當進入while,只有一次機會收到USB_INT_DISK_WRITE(再次發(fā)xWriteCH376Cmd(CMD2H_BYTE_WRITE)等 并不會再收到),然后進入下個CH376WriteReqBlock,但是此時只會返回0x1E(也就是USB_INT_DISK_WRITE的值),這樣的情況下,并不會真的寫30個字節(jié),而是只寫了一個字節(jié),就結(jié)束了。

不知道什么環(huán)節(jié)出了問題...

期間還發(fā)現(xiàn)一個問題,如果

xWriteCH376Cmd(CMD2H_BYTE_WRITE) ;

xWriteCH376Data((UINT8) ReqCount) ;

xWriteCH376Data((UINT8) (ReqCount>>8) )?

與Wait376Interrupt() 之間放一個斷點時間上不連續(xù),那么只會收到0x14,怎么也收不到0x1E了。

我試過直接斷點到CH376FileClose( TRUE ),還是只寫了一個字節(jié)...

這一個字節(jié)是0x11


您好,一個是您操作的文件的文件名是否符合8+3DOS文件名的格式要求?還有就是您說的實際寫入了一個字節(jié)是否是在整個字節(jié)寫函數(shù)完成退出之后實際在電腦上看到的一個字節(jié)?如果是可以嘗試一下手冊2中的DISK_READY命令刷新U盤自身的緩沖區(qū)。還有就是標題中說的大于30字節(jié)就會出現(xiàn)只寫如一個字節(jié)的問題,是否在少于30字節(jié)的寫入操作都是正確的呢?


首先謝謝樓上的假日回復,我到創(chuàng)建空白TXT文件這一步都是ok的,電腦上每次都能打開創(chuàng)建好的文件的,事實情況是無論寫多少個字節(jié),30個字節(jié)以下或者以上,我都只在新建的文件里用Notepad ++瀏覽Hex看到只有一個字節(jié),而這一個字節(jié)并不是CH376WriteReqBlock返回給我一個字節(jié)的空間,正如我在提問中所描述的,CH376WriteReqBlock依然返回0x1E,好像卡在了上一步的環(huán)節(jié),而且我還發(fā)現(xiàn),這種情況下,斷點調(diào)試時CH376FileClose( TRUE )會卡死在最后的那個中斷等待里,雖然不影響這個只有一個字節(jié)的文件在USB插入電腦后正常打開,但的確是等不到這個CH376FileClose( TRUE )的中斷返回。


您好,我這邊試了一下一次寫入了30個字節(jié)(正常寫入U盤),打印了一下返回值,函數(shù)如下。

image.png

打印值如下

s wait 1e

s len:1e

s wait 14

“s len”的返回值是由寫入字節(jié)的多少決定的(寫入字節(jié)31個,“s len”值就是1f)。可以看出CH376WriteReqBlock返回1e是一個巧合,和USB_INT_DISK_WRITE沒有關(guān)系。

下面給出一個在 DEMO2008.TXT文件里面寫入一段字符的例程,過程是,創(chuàng)建新文件,寫入數(shù)據(jù),關(guān)閉文件。其中LongName2的內(nèi)容為"This is Long Name File !!.TXT",正好30個字節(jié)

s?=?CH376FileCreate(?"/DEMO2008.TXT"?);?
CH376ByteWrite(LongName2,sizeof?(LongName2),cont?);?
s=CH376FileClose(TRUE);

您可以把寫入數(shù)據(jù)這部分的完整代碼貼出來,我這邊幫您看一下


你好,我用你們的例程在STM32的單片機中用等待方式 串口連接 的確沒問題,無論是寫30個以下字節(jié)還是30個以上字節(jié),正確的三個返回值先是0x1E再是長度lengh,最后是寫完后的0x14。


但是由于現(xiàn)實情況不允許原地等待中斷,只能改成定時查詢,然后我發(fā)現(xiàn)問題就是集中在第一個s = Wait376Interrupt() 函數(shù)分兩次查詢處理了,然后第二次查詢到要么還是0x14,要么就出錯了 比如0xB4(文件已關(guān)閉),這種情況顯然也得不到0x1E,也沒有后面的lengh了。


您可以把這部分代碼貼出來,我?guī)湍匆幌?/p>


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

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