各位大虾 急求 51单片机和ch376进行串口通信来管理usb设备和sd卡的程序??? 我下载了CH376EVT 但是我没有看懂 太多了[Emot]27[/Emot]
自己顶一下 知道的大虾 给我发过来啊 邮箱个人信息保护,已隐藏
主要实现的功能是 1 单片机和ch376进行的是串口通信 先在sd卡中建立一个txt文件 2 把单片机采集的数据通过ch376存入sd卡 3 如果有时把u盘插入 就把sd卡中的那个txt文件复制在u盘中
你可以先看EXAM1下面的例子程序。至于其他的都是EXAM1下面包括的C文件以及头文件。
我根据别人的 改写了sd卡的文件复制到u盘的程序 但是keil编译不了 大侠帮我看看你那出了错
#include #include #include "CH376INC.H" #include "DEBUG.H" #include "HAL.H" #include "FILE_SYS_C51.H" #include "ILAVOC_CH376_CHARG.H" #define MaxByteSize 1024 // 以字节方式复制文件 单次读写的最大字节数,根据单片机的RAM大小设定 最大65536字节 UINT8 xdata buf[MaxByteSize]; //读写数据缓冲区
//************************************************************************* //* NAME: Copy_SDtoUDisk(PUINT8 SourName, PUINT8 TarName ) //* FUCTION: 文件复制子函数 //* 输入参数:SourName:sd卡根目录下的文件名,TarName:u盘根目录下的文件名 //* 输出参数:文件复制成功,返回0x95,否则返回相应的错误代码 //* 说明: 将U盘根目录下的 文件复制到 SD的根目录下 //************************************************************************* UINT8 Copy_SDtoUDisk(PUINT8 SourName, PUINT8 TarName ) { UINT8 s; UINT16 len; UINT32 Count,FileSize;
CH376_SD_Mode( ); //设置成SD模式 s = CH376FileOpen( SourName ); //打开文件,该文件在根目录下 if ( s == USB_INT_SUCCESS ) { //文件存在并且已经被打开 FileSize = CH376GetFileSize( ); //读取当前文件长度 //StopIfError( s ); }else{ //源文件不存在 出错 return ( s ); } //以上操作主要是为了获取源文件的 文件大小FileSize. Count=0; do{ CH376_SD_Mode( ); //切换到SD模式 s = CH376FileOpen( SourName ); //打开文件,该文件在根目录下 if (s==USB_INT_SUCCESS){ //文件存在并且已经被打开,以字节方式移动文件指针以便读取后续数据 s = CH376ByteLocate( Count ); //移动到上次读取文件的末尾 CH376ByteRead( buf, sizeof(buf), &len ); // 以字节为单位从当前位置读取数据块,请求长度同缓冲区大小,返回实际长度在ThisLen中 Count += len; //计数已经读取的字节数 //s = CH376FileClose( FALSE ); //对于读取文件,是否关闭文件可选操作。 StopIfError( s ); }else { return s; } CH376_UDisk_Mode( ); //切换到U盘模式 s = CH376FileOpen( TarName ); //打开文件,该文件在根目录下 if ( s == USB_INT_SUCCESS ){ //文件存在并且已经被打开 s = CH376ByteLocate( 0xffffffff ); //移动文件指针到尾部以便添加数据 s = CH376ByteWrite( buf, len, NULL ); //以字节为单位向文件写入数据 StopIfError( s ); s = CH376FileClose( TRUE ); //关闭文件 StopIfError( s ); }else if ( s == ERR_MISS_FILE ){ //没有找到文件,必须新建文件 s = CH376FileCreate( NULL ); //新建文件并打开 StopIfError( s ); s = CH376ByteWrite( buf, len, NULL ); //以字节为单位向文件写入数据 StopIfError( s ); s = CH376FileClose( TRUE ); // 关闭文件 StopIfError( s ); }else return s; }while(Count < FileSize); return ( 0x95 ); //文件复制成功 }
//用单片机将CH376设置成读写SD卡模式( 模式3 ) void CH376_SD_Mode( ) { //UINT8 s; WriteCH376Cmd( CMD11_SET_USB_MODE ); /* 设备USB工作模式 */ WriteCH376Data( 0x03 ); //操作SD卡模式(0x03) DelayuS( 20 ); ReadCH376Data( ); //模式设置成功 应返回操作成功状态(0x51) // EndCH376Cmd( ); // for ( s = 0; s < 10; s ++ ) { /* 最长等待时间,10*50mS */ // DelaymS( 50 ); // if ( CH376DiskMount( ) == USB_INT_SUCCESS ) break; /* 初始化磁盘并测试磁盘是否就绪 */ // } }
//用单片机将CH376设置成读写U盘模式 void CH376_UDisk_Mode( ) { //UINT8 s; WriteCH376Cmd( CMD11_SET_USB_MODE ); /* 设备USB工作模式 */ WriteCH376Data( 0x06 ); //0x06模式 DelayuS( 20 ); ReadCH376Data( ); //模式设置成功 应返回操作成功状态(0x51) // EndCH376Cmd( ); // for ( s = 0; s < 10; s ++ ) { /* 最长等待时间,10*50mS */ // DelaymS( 50 ); // if ( CH376DiskMount( ) == USB_INT_SUCCESS ) break; /* 初始化磁盘并测试磁盘是否就绪 */ // } } void ChargManagement(void ) { UINT8 s; //UINT8 month, date, hour; //UINT16 Charge_data;
DelaymS( 100 ); /* 延时100毫秒 */ InitSTDIO( ); /* 为了让计算机通过串口监控演示过程 */
s = InitCH376Host( ); /* 初始化CH376 */ StopIfError( s ); /* 其它电路初始化 */
while ( CH376DiskConnect( ) != USB_INT_SUCCESS ) { /* 检查U盘是否连接,等待U盘插入,对于SD卡,可以由单片机直接查询SD卡座的插拔状态引脚 */ DelaymS( 100 ); } DelaymS( 200 ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */
/* 对于检测到USB设备的,最多等待10*50mS */ for ( s = 0; s < 10; s ++ ) { /* 最长等待时间,10*50mS */ DelaymS( 50 ); if ( CH376DiskMount( ) == USB_INT_SUCCESS ) break; /* 初始化磁盘并测试磁盘是否就绪 */ } // s = CH376ReadBlock( buf ); /* 如果需要,可以读取数据块CH376_CMD_DATA.DiskMountInq,返回长度 */ // if ( s == sizeof( INQUIRY_DATA ) ) { /* U盘的厂商和产品信息 */ // buf[ s ] = 0; // }
/* 如果ILAVOC_Charge and discharge.txt文件已经存在则添加数据到尾部,如果不存在则新建文件 */ s = CH376FileOpen( "\\ILAVOC_User.txt" ); /* 打开文件,该文件在根目录下 */ if ( s == USB_INT_SUCCESS ) { /* 文件存在并且已经被打开,移动文件指针到尾部以便添加数据 */ s = CH376ByteLocate( 0xFFFFFFFF ); /* 移到文件的尾部 */ StopIfError( s ); } else if ( s == ERR_MISS_FILE ) { /* 没有找到文件,必须新建文件 */ s = CH376FileCreate( NULL ); /* 新建文件并打开,如果文件已经存在则先删除后再新建,不必再提供文件名,刚才已经提供给CH376FileOpen */ StopIfError( s ); } else StopIfError( s ); /* 打开文件时出错 */ s = CH376ByteWrite( buf, s, NULL ); /* 以字节为单位向文件写入数据 */ StopIfError( s ); //Charge_data = get_data( ); 这里应该有一个单片机采集的数据处理函数 s = CH376ByteWrite( buf, s, NULL ); /* 以字节为单位向文件写入数据 */ /* 有些sd卡可能会要求在写数据后等待一会才能继续操作,所以,如果在某些sd卡中发生数据丢失现象,建议在每次写入数据后稍作延时再继续 */ StopIfError( s ); } s = CH376ByteWrite( buf, strlen( buf ), NULL ); /* 以字节为单位向文件写入数据 */ StopIfError( s ); s = CH376FileClose( TRUE ); /* 关闭文件,自动计算文件长度,以字节为单位写文件,建议让程序库关闭文件以便自动更新文件长度 */ StopIfError( s );
while ( CH376DiskConnect( ) == USB_INT_SUCCESS ) { /* 检查U盘是否连接,等待U盘拔出 */ DelaymS( 100 ); } DelaymS( 200 ); }
总是报这两个错 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( ); //用单片机将CH376设置成读写SD卡模式( 模式3 ) void CH376_UDisk_Mode( );//用单片机将CH376设置成读写U盘模式 void ChargManagement(void ); UINT8 Copy_SDtoUDisk(PUINT8 SourName, PUINT8 TarName );//SD卡向UDisk里面复制文件函数
#endif
你拿我们的例子程序去做工程就可以了啊。操作SD看的程序只是设置模式的时候将模式设置成模式3.检测SD卡的插入通过一个单片机的I/O口来检测SD卡的插入就可以。
拿你们的例子程序来做有没有什么差别 我需要那几个文件就可以了?
你看下我们的例子程序,需要包括以下几个文件: #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" 其他采用我们的例子程序就可以了。
老兄,把例子程序发我参考下吧,我最近也在研究这个呢,谢谢你咯 个人信息保护,已隐藏