各位大蝦 急求 51單片機(jī)和ch376進(jìn)行串口通信來管理usb設(shè)備和sd卡的程序??? 我下載了CH376EVT 但是我沒有看懂 太多了[Emot]27[/Emot]
自己頂一下 知道的大蝦 給我發(fā)過來啊 郵箱個(gè)人信息保護(hù),已隱藏
主要實(shí)現(xiàn)的功能是 1 單片機(jī)和ch376進(jìn)行的是串口通信 先在sd卡中建立一個(gè)txt文件 2 把單片機(jī)采集的數(shù)據(jù)通過ch376存入sd卡 3 如果有時(shí)把u盤插入 就把sd卡中的那個(gè)txt文件復(fù)制在u盤中
你可以先看EXAM1下面的例子程序。至于其他的都是EXAM1下面包括的C文件以及頭文件。
我根據(jù)別人的 改寫了sd卡的文件復(fù)制到u盤的程序 但是keil編譯不了 大俠幫我看看你那出了錯(cuò)
#include #include #include "CH376INC.H" #include "DEBUG.H" #include "HAL.H" #include "FILE_SYS_C51.H" #include "ILAVOC_CH376_CHARG.H" #define MaxByteSize 1024 // 以字節(jié)方式復(fù)制文件 單次讀寫的最大字節(jié)數(shù),根據(jù)單片機(jī)的RAM大小設(shè)定 最大65536字節(jié) UINT8 xdata buf[MaxByteSize]; //讀寫數(shù)據(jù)緩沖區(qū)
//************************************************************************* //* NAME: Copy_SDtoUDisk(PUINT8 SourName, PUINT8 TarName ) //* FUCTION: 文件復(fù)制子函數(shù) //* 輸入?yún)?shù):SourName:sd卡根目錄下的文件名,TarName:u盤根目錄下的文件名 //* 輸出參數(shù):文件復(fù)制成功,返回0x95,否則返回相應(yīng)的錯(cuò)誤代碼 //* 說明: 將U盤根目錄下的 文件復(fù)制到 SD的根目錄下 //************************************************************************* UINT8 Copy_SDtoUDisk(PUINT8 SourName, PUINT8 TarName ) { UINT8 s; UINT16 len; UINT32 Count,FileSize;
CH376_SD_Mode( ); //設(shè)置成SD模式 s = CH376FileOpen( SourName ); //打開文件,該文件在根目錄下 if ( s == USB_INT_SUCCESS ) { //文件存在并且已經(jīng)被打開 FileSize = CH376GetFileSize( ); //讀取當(dāng)前文件長(zhǎng)度 //StopIfError( s ); }else{ //源文件不存在 出錯(cuò) return ( s ); } //以上操作主要是為了獲取源文件的 文件大小FileSize. Count=0; do{ CH376_SD_Mode( ); //切換到SD模式 s = CH376FileOpen( SourName ); //打開文件,該文件在根目錄下 if (s==USB_INT_SUCCESS){ //文件存在并且已經(jīng)被打開,以字節(jié)方式移動(dòng)文件指針以便讀取后續(xù)數(shù)據(jù) s = CH376ByteLocate( Count ); //移動(dòng)到上次讀取文件的末尾 CH376ByteRead( buf, sizeof(buf), &len ); // 以字節(jié)為單位從當(dāng)前位置讀取數(shù)據(jù)塊,請(qǐng)求長(zhǎng)度同緩沖區(qū)大小,返回實(shí)際長(zhǎng)度在ThisLen中 Count += len; //計(jì)數(shù)已經(jīng)讀取的字節(jié)數(shù) //s = CH376FileClose( FALSE ); //對(duì)于讀取文件,是否關(guān)閉文件可選操作。 StopIfError( s ); }else { return s; } CH376_UDisk_Mode( ); //切換到U盤模式 s = CH376FileOpen( TarName ); //打開文件,該文件在根目錄下 if ( s == USB_INT_SUCCESS ){ //文件存在并且已經(jīng)被打開 s = CH376ByteLocate( 0xffffffff ); //移動(dòng)文件指針到尾部以便添加數(shù)據(jù) s = CH376ByteWrite( buf, len, NULL ); //以字節(jié)為單位向文件寫入數(shù)據(jù) StopIfError( s ); s = CH376FileClose( TRUE ); //關(guān)閉文件 StopIfError( s ); }else if ( s == ERR_MISS_FILE ){ //沒有找到文件,必須新建文件 s = CH376FileCreate( NULL ); //新建文件并打開 StopIfError( s ); s = CH376ByteWrite( buf, len, NULL ); //以字節(jié)為單位向文件寫入數(shù)據(jù) StopIfError( s ); s = CH376FileClose( TRUE ); // 關(guān)閉文件 StopIfError( s ); }else return s; }while(Count < FileSize); return ( 0x95 ); //文件復(fù)制成功 }
//用單片機(jī)將CH376設(shè)置成讀寫SD卡模式( 模式3 ) void CH376_SD_Mode( ) { //UINT8 s; WriteCH376Cmd( CMD11_SET_USB_MODE ); /* 設(shè)備USB工作模式 */ WriteCH376Data( 0x03 ); //操作SD卡模式(0x03) DelayuS( 20 ); ReadCH376Data( ); //模式設(shè)置成功 應(yīng)返回操作成功狀態(tài)(0x51) // EndCH376Cmd( ); // for ( s = 0; s < 10; s ++ ) { /* 最長(zhǎng)等待時(shí)間,10*50mS */ // DelaymS( 50 ); // if ( CH376DiskMount( ) == USB_INT_SUCCESS ) break; /* 初始化磁盤并測(cè)試磁盤是否就緒 */ // } }
//用單片機(jī)將CH376設(shè)置成讀寫U盤模式 void CH376_UDisk_Mode( ) { //UINT8 s; WriteCH376Cmd( CMD11_SET_USB_MODE ); /* 設(shè)備USB工作模式 */ WriteCH376Data( 0x06 ); //0x06模式 DelayuS( 20 ); ReadCH376Data( ); //模式設(shè)置成功 應(yīng)返回操作成功狀態(tài)(0x51) // EndCH376Cmd( ); // for ( s = 0; s < 10; s ++ ) { /* 最長(zhǎng)等待時(shí)間,10*50mS */ // DelaymS( 50 ); // if ( CH376DiskMount( ) == USB_INT_SUCCESS ) break; /* 初始化磁盤并測(cè)試磁盤是否就緒 */ // } } void ChargManagement(void ) { UINT8 s; //UINT8 month, date, hour; //UINT16 Charge_data;
DelaymS( 100 ); /* 延時(shí)100毫秒 */ InitSTDIO( ); /* 為了讓計(jì)算機(jī)通過串口監(jiān)控演示過程 */
s = InitCH376Host( ); /* 初始化CH376 */ StopIfError( s ); /* 其它電路初始化 */
while ( CH376DiskConnect( ) != USB_INT_SUCCESS ) { /* 檢查U盤是否連接,等待U盤插入,對(duì)于SD卡,可以由單片機(jī)直接查詢SD卡座的插拔狀態(tài)引腳 */ DelaymS( 100 ); } DelaymS( 200 ); /* 延時(shí),可選操作,有的USB存儲(chǔ)器需要幾十毫秒的延時(shí) */
/* 對(duì)于檢測(cè)到USB設(shè)備的,最多等待10*50mS */ for ( s = 0; s < 10; s ++ ) { /* 最長(zhǎng)等待時(shí)間,10*50mS */ DelaymS( 50 ); if ( CH376DiskMount( ) == USB_INT_SUCCESS ) break; /* 初始化磁盤并測(cè)試磁盤是否就緒 */ } // s = CH376ReadBlock( buf ); /* 如果需要,可以讀取數(shù)據(jù)塊CH376_CMD_DATA.DiskMountInq,返回長(zhǎng)度 */ // if ( s == sizeof( INQUIRY_DATA ) ) { /* U盤的廠商和產(chǎn)品信息 */ // buf[ s ] = 0; // }
/* 如果ILAVOC_Charge and discharge.txt文件已經(jīng)存在則添加數(shù)據(jù)到尾部,如果不存在則新建文件 */ s = CH376FileOpen( "\\ILAVOC_User.txt" ); /* 打開文件,該文件在根目錄下 */ if ( s == USB_INT_SUCCESS ) { /* 文件存在并且已經(jīng)被打開,移動(dòng)文件指針到尾部以便添加數(shù)據(jù) */ s = CH376ByteLocate( 0xFFFFFFFF ); /* 移到文件的尾部 */ StopIfError( s ); } else if ( s == ERR_MISS_FILE ) { /* 沒有找到文件,必須新建文件 */ s = CH376FileCreate( NULL ); /* 新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建,不必再提供文件名,剛才已經(jīng)提供給CH376FileOpen */ StopIfError( s ); } else StopIfError( s ); /* 打開文件時(shí)出錯(cuò) */ s = CH376ByteWrite( buf, s, NULL ); /* 以字節(jié)為單位向文件寫入數(shù)據(jù) */ StopIfError( s ); //Charge_data = get_data( ); 這里應(yīng)該有一個(gè)單片機(jī)采集的數(shù)據(jù)處理函數(shù) s = CH376ByteWrite( buf, s, NULL ); /* 以字節(jié)為單位向文件寫入數(shù)據(jù) */ /* 有些sd卡可能會(huì)要求在寫數(shù)據(jù)后等待一會(huì)才能繼續(xù)操作,所以,如果在某些sd卡中發(fā)生數(shù)據(jù)丟失現(xiàn)象,建議在每次寫入數(shù)據(jù)后稍作延時(shí)再繼續(xù) */ StopIfError( s ); } s = CH376ByteWrite( buf, strlen( buf ), NULL ); /* 以字節(jié)為單位向文件寫入數(shù)據(jù) */ StopIfError( s ); s = CH376FileClose( TRUE ); /* 關(guān)閉文件,自動(dòng)計(jì)算文件長(zhǎng)度,以字節(jié)為單位寫文件,建議讓程序庫(kù)關(guān)閉文件以便自動(dòng)更新文件長(zhǎng)度 */ StopIfError( s );
while ( CH376DiskConnect( ) == USB_INT_SUCCESS ) { /* 檢查U盤是否連接,等待U盤拔出 */ DelaymS( 100 ); } DelaymS( 200 ); }
總是報(bào)這兩個(gè)錯(cuò) FILE_SYS_C51.C(161): error C267: 'CH376ReadVar8': requires ANSI-style prototype ILAVOC_CH376_CHARG.C(41): error C267: 'CH376FileOpen': requires ANSI-style prototype
這是.h文件
#ifndef __ILAVOC_CH376_CHARG_H__ #define __ILAVOC_CH376_CHARG_H__
void CH376_SD_Mode( ); //用單片機(jī)將CH376設(shè)置成讀寫SD卡模式( 模式3 ) void CH376_UDisk_Mode( );//用單片機(jī)將CH376設(shè)置成讀寫U盤模式 void ChargManagement(void ); UINT8 Copy_SDtoUDisk(PUINT8 SourName, PUINT8 TarName );//SD卡向UDisk里面復(fù)制文件函數(shù)
#endif
你拿我們的例子程序去做工程就可以了啊。操作SD看的程序只是設(shè)置模式的時(shí)候?qū)⒛J皆O(shè)置成模式3.檢測(cè)SD卡的插入通過一個(gè)單片機(jī)的I/O口來檢測(cè)SD卡的插入就可以。
拿你們的例子程序來做有沒有什么差別 我需要那幾個(gè)文件就可以了?
你看下我們的例子程序,需要包括以下幾個(gè)文件: #include "..\HAL.H" #include "..\HAL_BASE.C" #include "..\DEBUG.H" #include "..\DEBUG.C" #include "..\PARA_HW.C" /* 硬件總線并口連接方式 */ //#include "..\PARA_SW.C" /* 軟件模擬并口連接方式 */ //#include "..\SPI_HW.C" /* 硬件SPI連接方式 */ //#include "..\SPI_SW.C" /* 軟件模擬SPI方式 */ //#include "..\UART_HW.C" /* 硬件異步串口連接方式 */ #define EN_DISK_QUERY 1 /* 啟用磁盤查詢 */ #include "..\FILE_SYS.H" #include "..\FILE_SYS.C" 其他采用我們的例子程序就可以了。
老兄,把例子程序發(fā)我參考下吧,我最近也在研究這個(gè)呢,謝謝你咯 個(gè)人信息保護(hù),已隱藏