📄 ch375hf1.c
字号:
else if ( status == ERR_MISS_FILE ) { /* 文件不存在 */
status = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */
}
if ( status == ERR_SUCCESS ) { /* 文件已经打开 */
mCmdParam.ByteWrite.mByteCount = mCopyCodeString( mCmdParam.ByteWrite.mByteBuffer, "在CH375的U盘模块自动演示时写入当前信息:\xd\xa版本=串口标准版V" );
mByteToString( & mCmdParam.ByteWrite.mByteBuffer[ mCmdParam.ByteWrite.mByteCount ], FILE_MODULE_VER ); /* 将数据转换为十六进制字符串 */
mCmdParam.ByteWrite.mByteCount += 2;
status = CH375ByteWrite( ); /* 以字节为单位向当前文件写入数据 */
if ( status == ERR_SUCCESS ) {
mCmdParam.ByteWrite.mByteCount = mCopyCodeString( mCmdParam.ByteWrite.mByteBuffer, ", 工作模式和接口配置值=" );
mByteToString( & mCmdParam.ByteWrite.mByteBuffer[ mCmdParam.ByteWrite.mByteCount ], mWorkMode ); /* 将数据转换为十六进制字符串 */
mCmdParam.ByteWrite.mByteCount += 2;
mCmdParam.ByteWrite.mByteCount += mCopyCodeString( & mCmdParam.ByteWrite.mByteBuffer[ mCmdParam.ByteWrite.mByteCount ], "H, 串口波特率除数/兼容I2C设备地址=" );
mByteToString( & mCmdParam.ByteWrite.mByteBuffer[ mCmdParam.ByteWrite.mByteCount ], 0 - RCAP2L ); /* 将数据转换为十六进制字符串 */
mCmdParam.ByteWrite.mByteCount += 2;
mCmdParam.ByteWrite.mByteCount += mCopyCodeString( & mCmdParam.ByteWrite.mByteBuffer[ mCmdParam.ByteWrite.mByteCount ], "H\xd\xa" );
status = CH375ByteWrite( ); /* 以字节为单位向当前文件写入数据 */
if ( status == ERR_SUCCESS ) {
mCmdParam.Close.mUpdateLen = 1;
status = CH375FileClose( ); /* 关闭当前文件 */
}
}
}
}
mDelaymS( 100 );
SBUF = 0x57;
while ( 1 ) { /* 演示完成后停机,成功则LED常亮,失败则LED闪烁 */
mDelaymS( 250 );
BUSY_OUT = 0; /* 空闲 */
if ( status != ERR_SUCCESS ) { /* 演示过程中出现错误 */
mDelaymS( 250 );
BUSY_OUT = 1;
}
}
}
EA = 0; /* 命令执行期间禁止中断 */
BUSY_OUT = 1; /* 命令执行正忙 */
INT_OUT = 1;
TR0 = 0;
AUXR = 0x01; /* 使能内部扩展RAM,禁止无效ALE */
status = ERR_SUCCESS;
RetLen = 0; /* 默认返回长度为0 */
if ( mUsbModeDevice == 0 ) { /* USB主机模式 */
if ( CH375_INT_WIRE == 0 && mCmdCode != CMD_QueryStatus ) mQueryCH375( ); /* 如果CH375的中断引脚输出低电平则先处理中断状态 */
switch ( mCmdCode ) { /* 分析命令码 */
case CMD_QueryStatus: /* 查询当前模块的状态 */
if ( mQueryCH375( ) != ERR_CH375_ERROR ) { /* 查询CH375的中断状态,CH375尚未出错 */
if ( mTestCH375( ) ) CH375DiskStatus = DISK_UNKNOWN; /* 返回数据应该是测试数据取反,否则CH375出错 */
}
mCmdParam.Status.mLastStatus = mLastState; /* 上次的状态 */
mCmdParam.Status.mDiskStatus = CH375DiskStatus; /* 当前磁盘及文件状态 */
mCmdParam.Status.mIntStatus = CH375IntStatus; /* 上次CH375操作的中断状态 */
mCmdParam.Status.reserved = 0;
mCmdParam.Status.mFileSize = CH375vFileSize; /* 当前文件的长度 */
mCmdParam.Status.mCurrentOffset = CH375vCurrentOffset; /* 当前文件指针,当前读写位置的字节偏移 */
RetLen = sizeof( mCmdParam.Status );
if ( mModeBigEndian == 0 ) { /* 小端格式,转换字节顺序 */
mConvertDword( & mCmdParam.Status.mFileSize );
mConvertDword( & mCmdParam.Status.mCurrentOffset );
}
break;
case CMD_DiskQuery: /* 查询磁盘信息 */
status = CH375DiskQuery( );
if ( status == ERR_SUCCESS ) RetLen = sizeof( mCmdParam.Query ); /* 操作成功则返回结果 */
if ( mModeBigEndian == 0 ) { /* 小端格式,转换字节顺序 */
mConvertDword( & mCmdParam.Query.mDiskSizeSec );
mConvertDword( & mCmdParam.Query.mTotalSector );
mConvertDword( & mCmdParam.Query.mFreeSector );
}
break;
case CMD_FileEnumer: /* 枚举文件,返回文件名 */
status = CH375FileEnumer( );
if ( status == ERR_SUCCESS ) { /* 操作成功则计算返回结果 */
mCmdParam.Enumer.mPathName[ MAX_PATH_LEN - 1 ] = 0; /* 结束标志 */
NameBuf = (PUINT8I)( &mCmdParam );
while ( *NameBuf != 0 ) { /* 计算文件名的长度 */
RetLen ++;
NameBuf ++;
}
RetLen ++; /* 包含字符串结束符后的长度 */
}
break;
case CMD_FileOpen: /* 打开文件 */
status = CH375FileOpen( );
break;
case CMD_FileCreate: /* 新建文件并打开,如果文件已经存在则先删除后再新建 */
status = CH375FileCreate( );
break;
case CMD_FileErase: /* 删除文件并关闭 */
status = CH375FileErase( );
break;
case CMD_FileClose: /* 关闭当前文件 */
status = CH375FileClose( );
break;
case CMD_FileQuery: /* 查询当前文件的信息 */
status = CH375FileQuery( );
if ( status == ERR_SUCCESS ) RetLen = sizeof( mCmdParam.Modify ); /* 操作成功则返回结果 */
if ( mModeBigEndian == 0 ) { /* 小端格式,转换字节顺序 */
mConvertDword( & mCmdParam.Modify.mFileSize );
mConvertWord( & mCmdParam.Modify.mFileDate );
mConvertWord( & mCmdParam.Modify.mFileTime );
}
break;
case CMD_FileModify: /* 查询或者修改当前文件的信息 */
if ( mModeBigEndian == 0 ) { /* 小端格式,转换字节顺序 */
mConvertDword( & mCmdParam.Modify.mFileSize );
mConvertWord( & mCmdParam.Modify.mFileDate );
mConvertWord( & mCmdParam.Modify.mFileTime );
}
status = CH375FileModify( );
if ( status == ERR_SUCCESS ) RetLen = sizeof( mCmdParam.Modify ); /* 操作成功则返回结果 */
if ( mModeBigEndian == 0 ) { /* 小端格式,转换字节顺序 */
mConvertDword( & mCmdParam.Modify.mFileSize );
mConvertWord( & mCmdParam.Modify.mFileDate );
mConvertWord( & mCmdParam.Modify.mFileTime );
}
break;
case CMD_FileLocate: /* 移动当前文件指针 */
if ( mModeBigEndian == 0 ) { /* 小端格式,转换字节顺序 */
mConvertDword( & mCmdParam.Locate.mSectorOffset );
}
status = CH375FileLocate( );
if ( mModeBigEndian == 0 ) { /* 小端格式,转换字节顺序 */
mConvertDword( & mCmdParam.Locate.mSectorOffset );
}
break;
case CMD_FileRead: /* 从当前文件读取数据 */
mCmdParam.ReadX.mDataBuffer = 0;
status = CH375FileReadX( );
RetLen = sizeof( mCmdParam.Read );
break;
case CMD_FileWrite: /* 向当前文件写入数据 */
mCmdParam.WriteX.mDataBuffer = 0;
status = CH375FileWriteX( );
RetLen = sizeof( mCmdParam.Write );
break;
case CMD_ByteLocate: /* 以字节为单位移动当前文件指针 */
if ( mModeBigEndian == 0 ) { /* 小端格式,转换字节顺序 */
mConvertDword( & mCmdParam.ByteLocate.mByteOffset );
}
status = CH375ByteLocate( );
if ( mModeBigEndian == 0 ) { /* 小端格式,转换字节顺序 */
mConvertDword( & mCmdParam.ByteLocate.mByteOffset );
}
break;
case CMD_ByteRead: /* 以字节为单位从当前文件读取数据 */
status = CH375ByteRead( );
if ( status == ERR_SUCCESS ) RetLen = mCmdParam.ByteRead.mByteCount + 1; /* 操作成功则返回结果 */
else RetLen = 1;
break;
case CMD_ByteWrite: /* 以字节为单位向当前文件写入数据 */
status = CH375ByteWrite( );
RetLen = 1;
break;
case CMD_StreamRead: /* 数据流模式读文件,只支持串口,只支持文本 */
TI = 0;
CH375DiskConnect( ); /* 检查磁盘是否连接 */
if ( CH375DiskStatus < DISK_OPEN_FILE ) { /* 尚未打开文件 */
if ( CH375DiskStatus < DISK_CONNECT ) { /* U盘尚未连接 */
for ( RetLen = 250; RetLen != 0; RetLen -- ) { /* 等待U盘连接 */
mDelaymS( 50 ); /* 等待后再查询 */
if ( RI && SBUF == SER_STREAM_END ) goto StreamExit; /* 要求退出 */
mDelaymS( 50 ); /* 等待后再查询 */
if ( RI && SBUF == SER_STREAM_END ) goto StreamExit; /* 要求退出 */
if ( CH375DiskConnect( ) == ERR_SUCCESS ) break; /* 检查磁盘是否连接,U盘已经连接 */
}
}
if ( CH375DiskStatus < DISK_READY ) { /* U盘尚未分析 */
mDelaymS( 200 ); /* 等待U盘稳定 */
for ( RetLen = 20; RetLen != 0; RetLen -- ) { /* 等待U盘就绪 */
mDelaymS( 50 ); /* 等待后再查询 */
if ( RI && SBUF == SER_STREAM_END ) goto StreamExit; /* 要求退出 */
mDelaymS( 50 ); /* 等待后再查询 */
if ( RI && SBUF == SER_STREAM_END ) goto StreamExit; /* 要求退出 */
status = CH375DiskReady( ); /* 查询磁盘是否准备好 */
if ( status == ERR_SUCCESS ) break;
}
}
mCopyCodeString( mCmdParam.Open.mPathName, STREAM_DEFAULT_FILE ); /* 默认数据流文件 */
status = CH375FileOpen( ); /* 打开文件 */
if ( status != ERR_SUCCESS ) { /* 打开文件失败 */
RetLen = SER_STREAM_ERROR; /* 提示错误 */
goto StreamExitSend;
}
}
while ( 1 ) {
if ( RI ) { /* 接收到控制码 */
RI = 0;
RetLen = SBUF;
if ( RetLen == SER_STREAM_ACK ) { /* 接收应答 */
}
else if ( RetLen == SER_STREAM_END ) { /* 要求退出 */
if ( TI && mCmdParam.ByteRead.mByteCount ) { /* 已经发送过数据并且已经预读过数据 */
mCmdParam.ByteLocate.mByteOffset = CH375vCurrentOffset - 1;
status = CH375ByteLocate( ); /* 回移文件指针 */
}
RetLen = status == ERR_SUCCESS ? SER_STREAM_ACK : SER_STREAM_ERROR; /* 提示 */
break;
}
else if ( RetLen == SER_STREAM_FLUSH ) { /* 要求刷新 */
mCmdParam.ByteLocate.mByteOffset = 0;
status = CH375ByteLocate( ); /* 移动文件指针到首字节 */
if ( status == ERR_SUCCESS ) { /* 操作成功 */
TI = 0; /* 指示未预读数据 */
continue;
}
else {
RetLen = SER_STREAM_ERROR; /* 提示错误 */
break;
}
}
else if ( TI ) { /* 已经发送过数据 */
while ( RI == 0 ); /* 重新等待应答 */
continue;
}
}
if ( TI == 0 ) { /* 尚未预读数据 */
mCmdParam.ByteRead.mByteCount = 1;
status = CH375ByteRead( ); /* 从文件读取一个数据 */
}
if ( status != ERR_SUCCESS ) { /* 读操作失败 */
RetLen = SER_STREAM_ERROR; /* 提示错误 */
break;
}
if ( mCmdParam.ByteRead.mByteCount == 0 ) { /* 文件结束 */
RetLen = SER_STREAM_END; /* 提示结束 */
break;
}
TI = 0;
SBUF = mCmdParam.ByteRead.mByteBuffer[0]; /* 发送数据 */
mCmdParam.ByteRead.mByteCount = 1;
status = CH375ByteRead( ); /* 从文件读取一个数据 */
while ( TI == 0 ); /* 等待发送完成 */
#ifdef WATCHDOG_TIMEOUT
while ( RI == 0 ) WDT = 1; /* 等待应答,清除看门狗计时 */
#else
while ( RI == 0 ); /* 等待应答 */
#endif
}
StreamExitSend:
TI = 0;
SBUF = RetLen;
while ( TI == 0 );
StreamExit:
mLastState = status; /* 保存本次状态 */
EXT_INT_FLAG = 0; /* 清除中断标志 */
RI = 0; TI = 0; /* 清除中断标志 */
mCmdAction = 0; /* 清命令激活位 */
AUXR = 0x03; /* 禁止内部扩展RAM,禁止无效ALE */
EA = 1; /* 允许中断 */
continue;
break;
case CMD_StreamWrite: /* 数据流模式写文件,只支持串口,只支持文本 */
TI = 0;
CH375DiskConnect( ); /* 检查磁盘是否连接 */
if ( CH375DiskStatus < DISK_OPEN_FILE ) { /* 尚未打开文件 */
if ( CH375DiskStatus < DISK_CONNECT ) { /* U盘尚未连接 */
for ( RetLen = 250; RetLen != 0; RetLen -- ) { /* 等待U盘连接 */
mDelaymS( 50 ); /* 等待后再查询 */
if ( RI && SBUF == SER_STREAM_END ) goto StreamExit; /* 要求退出 */
mDelaymS( 50 ); /* 等待后再查询 */
if ( RI && SBUF == SER_STREAM_END ) goto StreamExit; /* 要求退出 */
if ( CH375DiskConnect( ) == ERR_SUCCESS ) break; /* 检查磁盘是否连接,U盘已经连接 */
}
}
if ( CH375DiskStatus < DISK_READY ) { /* U盘尚未分析 */
mDelaymS( 200 ); /* 等待U盘稳定 */
for ( RetLen = 20; RetLen != 0; RetLen -- ) { /* 等待U盘就绪 */
mDelaymS( 50 ); /* 等待后再查询 */
if ( RI && SBUF == SER_STREAM_END ) goto StreamExit; /* 要求退出 */
mDelaymS( 50 ); /* 等待后再查询 */
if ( RI && SBUF == SER_STREAM_END ) goto StreamExit; /* 要求退出 */
status = CH375DiskReady( ); /* 查询磁盘是否准备好 */
if ( status == ERR_SUCCESS ) break;
}
}
mCopyCodeString( mCmdParam.Open.mPathName, STREAM_DEFAULT_FILE ); /* 默认数据流文件 */
status = CH375FileOpen( ); /* 打开文件 */
if ( status == ERR_SUCCESS ) { /* 文件已经存在 */
mCmdParam.ByteLocate.mByteOffset = 0xFFFFFFFF;
status = CH375ByteLocate( ); /* 以字节为单位移动当前文件指针,移到文件末尾以追加数据 */
}
else if ( status == ERR_MISS_FILE ) { /* 文件不存在 */
status = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */
}
if ( status != ERR_SUCCESS ) { /* 打开文件失败 */
RetLen = SER_STREAM_ERROR; /* 提示错误 */
goto StreamExitSend;
}
}
mCmdParam.ByteWrite.mByteCount = 0;
TI = 1;
while ( 1 ) {
if ( RI == 0 ) { /* 尚未接收到数据 */
RetLen = 255; /* 超时计数 */
TH0 = 0;
TF0 = 0; /* 清定时器0溢出标志 */
TR0 = 1; /* 打开定时器0检查超时 */
while ( RI == 0 ) { /* 等待接收 */
#ifdef WATCHDOG_TIMEOUT
WDT = 1; /* 清除看门狗计时 */
#endif
if ( TF0 && RetLen ) { /* 超时 */
TF0 = 0;
RetLen --; /* 计数 */
if ( RetLen == 0 ) { /* 累计超时足够则自动刷新 */
status = CH375ByteWrite( ); /* 将缓冲区中的数据写入文件 */
if ( status == ERR_SUCCESS && mCmdParam.ByteWrite.mByteCount ) { /* 操作成功 */
mCmdParam.ByteWrite.mByteCount = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -