我移至CH376芯片在51單片機的例程用到了我的stm32單片機上,程序是一直串口接收數(shù)據(jù)然后放到緩沖區(qū)并寫入優(yōu)盤,可是每隔一段時間,就會發(fā)現(xiàn)存儲下來的數(shù)據(jù)中間丟失若干字節(jié),怎么回事???
本身CH376寫數(shù)據(jù)的時候中斷狀態(tài)返回是否正常?如果狀態(tài)返回正常那么就要考慮你循環(huán)通過串口寫數(shù)據(jù)是否會出現(xiàn)丟數(shù)據(jù)的現(xiàn)象。
我是用雙buffer輪流接收串口數(shù)據(jù),接收后放到一個大的buffer中去,對這個大的buffer進(jìn)行U盤寫入,我看到ch376評估板說明上說在數(shù)據(jù)剛剛寫入U盤后還有一個延后寫Flash的過程,,個別u盤延時3秒。我懷疑是不是在這個寫入的時間占用CPU及總線時間過長,導(dǎo)致此時CPU及總線無時間接收串口發(fā)來的數(shù)據(jù)而導(dǎo)致的丟失呢?
s = CH376SecWrite( FileDataBuf, (UINT8)( total / DEF_SECTOR_SIZE ), NULL ); /* 將緩沖區(qū)中的字節(jié)數(shù)轉(zhuǎn)換為扇區(qū)數(shù)(除以DEF_SECTOR_SIZE),最后的零頭數(shù)據(jù)先不管,以扇區(qū)為單位向文件寫入數(shù)據(jù) */
如果你擔(dān)心串口那邊會丟失數(shù)據(jù),你可以想個方法檢測下,比如STM32串口的接受可以開DMA,以保證數(shù)據(jù)不丟失
本身其實有兩個問題,一個是數(shù)據(jù)丟失,一個是運行一段時間會進(jìn)入一個死循環(huán)。硬件仿真發(fā)現(xiàn)程序停在了 void mStopIfError(uint8_t iError) 這個里面,應(yīng)該是執(zhí)行void mFlushBufferToDisk( uint8_t force ) 里面的s = CH376SecWrite( FileDataBuf, (UINT8)( total / DEF_SECTOR_SIZE ), NULL ); /* 將緩沖區(qū)中的字節(jié)數(shù)轉(zhuǎn)換為扇區(qū)數(shù)(除以DEF_SECTOR_SIZE),最后的零頭數(shù)據(jù)先不管,以扇區(qū)為單位向文件寫入數(shù)據(jù) */ 時出現(xiàn)錯誤, 如果是H376寫數(shù)據(jù)的時候中斷狀態(tài)返回不正常那考慮是什么問題呢?我主要代碼是: char USART1_DMA_Buf1[buf_size+1]; USART1_DMA_Buf1[buf_size]='\0'; total += sprintf( FileDataBuf + total, "%.512s", USART1_DMA_Buf2 ); mFlushBufferToDisk( 0 ); /* 自動刷新緩沖區(qū),檢查緩沖區(qū)是否已滿,滿則寫盤 */
已經(jīng)開了DMA,設(shè)置了DMA512字節(jié)緩沖,存放到USART1_DMA_Buf1數(shù)組中去。
單步運行調(diào)試的時候發(fā)現(xiàn)mFlushBufferToDisk( 0 );這條語句運行正常,返回值也都正常,程序一直循環(huán)寫入,幾次單步運行都正常,問題就是發(fā)生在數(shù)據(jù)一直寫入的時候,不知過多長時間,就會出現(xiàn)錯誤,轉(zhuǎn)入到 mStopIfError(uint8_t iError)函數(shù)中去。
剛才看其他帖子,發(fā)現(xiàn)你好像有stm32操作ch376的程序,能不能發(fā)一份借鑒一下。我的郵箱是個人信息保護(hù),已隱藏。多謝。
你什么接口與376通訊的?如果你接口沒有問題,那么其它例程都是C語言寫的移植很方便。 扇區(qū)寫出錯,可能硬件有問題,你可以把你的硬件發(fā)至我郵箱 還有你可以先確定是哪邊出現(xiàn)問題,比如你這樣做下,開個512以上的緩沖區(qū)FileDataBuf,調(diào)用用這個函數(shù)s = CH376SecWrite( FileDataBuf,1)1000次,看文件數(shù)據(jù)是不是500K,先排除你哪邊出問題的
我是用spi通訊的,接口應(yīng)該沒問題,不過方便的話我還是想學(xué)習(xí)一下。 調(diào)用用這個函數(shù)s = CH376SecWrite( FileDataBuf,1,NULL)1000次,看文件數(shù)據(jù)是500K。試了四五次都是500k,這說名扇區(qū)寫正常,問題應(yīng)該出要寫入的這個FileDataBuf不正常嗎?
多次幾次,寫的次數(shù)多點,如果還是沒有問題,說明扇區(qū)寫沒有問題,丟數(shù)據(jù)應(yīng)該在你串口接收或者把接收的數(shù)據(jù)放到FileDataBuf中有問題
昨天開始測試到今天已經(jīng)過了10個小時了,又沒問題了,好奇怪啊。 謝謝了。