95 lines
2.1 KiB
C
95 lines
2.1 KiB
C
//功能:单片机读取VGUS屏返回指令
|
||
//来源:武汉中显科技有限公司 www.viewtech.cn
|
||
//全局变量
|
||
u16 StartNum=0,TalNum=0;
|
||
#define BUFFER_SIZE 2048//指令缓冲区大小,用户可根据自己单片机的容量修改
|
||
u8 CommBuff[BUFFER_SIZE]//定义指令缓冲区
|
||
#define USER_R3 0xA5//帧头
|
||
#define USER_RA 0x5A//帧头
|
||
/////////////////
|
||
//串口中断函数
|
||
//用户根据单片机的不同,修改串口中断函数,中断函数内只保存串口数据到缓冲区
|
||
void USART3_IRQHandler(void)
|
||
{
|
||
CommBuff[TalNum++]=USART_ReceiveData(USART3);//保存串口数据
|
||
if(TalNum==BUFFER_SIZE)
|
||
TalNum=0;
|
||
}
|
||
|
||
|
||
//主程序指令解析函数
|
||
//用户在主循环中调用
|
||
void deal_command()
|
||
{
|
||
u16 i,CurNum,tem_TalNum;
|
||
u8 CmdBuf[256];
|
||
u16 nowbuffer,len;
|
||
len=StartNum;
|
||
tem_TalNum=TalNum;
|
||
if(tem_TalNum==len)//
|
||
return;
|
||
if(CommBuff[StartNum]!=USER_R3)
|
||
{
|
||
StartNum++;
|
||
if(StartNum==BUFFER_SIZE)
|
||
StartNum=0;
|
||
return;
|
||
}
|
||
if(tem_TalNum>len)
|
||
nowbuffer=tem_TalNum-len;
|
||
else
|
||
nowbuffer=tem_TalNum+BUFFER_SIZE-len;
|
||
if(nowbuffer<5)
|
||
return;
|
||
CurNum=StartNum+2;
|
||
if(CurNum>BUFFER_SIZE-1)
|
||
CurNum-=BUFFER_SIZE;
|
||
len=CommBuff[CurNum]+3;
|
||
if(nowbuffer<len)
|
||
return;
|
||
i=0;
|
||
CurNum=StartNum;
|
||
while(1)
|
||
{
|
||
CmdBuf[i++]=CommBuff[CurNum++];
|
||
if(CurNum==BUFFER_SIZE)
|
||
CurNum=0;
|
||
if(i==4)
|
||
{
|
||
if(CmdBuf[0]!=USER_R3||CmdBuf[1]!=USER_RA)//
|
||
{
|
||
StartNum=CurNum;
|
||
return;
|
||
}
|
||
len=CmdBuf[2];
|
||
}
|
||
else if(i>4)
|
||
{
|
||
if(i==len+3)//
|
||
{
|
||
StartNum=CurNum;
|
||
break;
|
||
}
|
||
else if(i>255)//
|
||
{
|
||
StartNum=CurNum;
|
||
return;
|
||
}
|
||
else if(CurNum==tem_TalNum)
|
||
return;
|
||
}
|
||
}
|
||
///现在解析指令CmdBuf保存一整条指令
|
||
switch(CmdBuf[3])
|
||
{
|
||
case 0x81:
|
||
|
||
break;
|
||
case 0x83:
|
||
|
||
break;
|
||
default:////命令无效,删除
|
||
break;
|
||
}
|
||
return;
|
||
} |