武汉中显液晶模块的串口处理程序。其中包含了多字节(不定长)串口的处理方法。可以参考。
单片机源程序如下:
- //功能:单片机读取VGUS屏返回指令
- //来源:中显科技
- //全局变量
- 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;
- }
复制代码
所有资料51hei提供下载:
单片机读取VGUS屏返回指令.rar
(976 Bytes, 下载次数: 21)
|