//串口接收缓冲区
u8 serial_Buffer[SERIAL_MAX_LENGTH] = {0};
//串口接收数据长度
u16 serial_Buffer_Length = 0;
u8 receiveMode = 0;//接收参数的中断处理模型,为0的时候是命令模式,为1的时候为下载模式
u8 receiveExpectCount = 0;//串口期望接收长度
//串口中断处理
static void SerialRecv(u8 ch)
{
if(receiveMode == 0)
{
if((serial_Buffer_Length&0x8000)== 0x8000)//已经接收完成,系统还没处理
{
serial_Buffer_Length |=0x8000;//退出
}
elseif((serial_Buffer_Length&0x4000) == 0x4000)//接收到回车还没接收到换行
{
if(ch ==‘\n‘)serial_Buffer_Length |= 0x8000;
else
{
//一帧接受失败
serial_Buffer_Length =0;
}
}
else
{
if((serial_Buffer_Length&0xff)< SERIAL_MAX_LENGTH)
{
if(ch ==‘\r‘)serial_Buffer_Length |= 0x4000;
else
{
serial_Buffer[(serial_Buffer_Length&0xff)] = ch;
serial_Buffer_Length++;
}
}
else
{
//一帧接受失败
serial_Buffer_Length =0;
}
}
}
else
{
//下载模式,只控制字符串的量,数据的第一位是该数据包的长度,接收到这么多长度,接收完成位置一
//注意,在这种模式下,清除serial_Buffer_Length之前应当清除receiveExpectCount的值
if(receiveExpectCount == 0)//期望下载为0,第一个数就是期望下载数
{
receiveExpectCount = ch;
}
else
{
if((serial_Buffer_Length&0x8000)== 0x8000)//已经接收完成,系统还没处理,此时不接收数据
{
serial_Buffer_Length |=0x8000;//退出
}
else
{
serial_Buffer[(serial_Buffer_Length&0xff)]= ch;//接收数据并保存
serial_Buffer_Length++;
if((serial_Buffer_Length&0xff)== receiveExpectCount)//接收到了期望长度的数据
{
serial_Buffer_Length|= 0x8000;//一包接收完成标志
}
}
}
}
}"iap_down"
"iap_jump_app"
"iap_over"
"iap_set_flag"
"iap_clear_flag"欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |