单片机与触控屏通信 按下屏幕下发 AA 79 ** ** 33 cc c3 3c 抬起屏幕下发 AA 78 ** ** 33 cc c3 3c 中间两个字节用户定义相同指令
以下部分代码
uchar buf[16]; //接收缓存区 这里因为上电握手最大长度,所以给了16 下面程序只用到8个字节
uchar rp = 0; //缓存区地址
void interrupt_uart() interrupt 4 //using 3 //串口接收,定时器2 115200
{
if (RI)
{
RI = 0 ;
buf[ rp++ ] = SBUF;
if(SBUF==0X3C) //接收到尾 地址复位
rp=0;
}
}
void key_service() //放在大循环 while(1) 里一直调用
{
switch(buf[1]) //对应该按下 指令 79后进行比较
{
case 0X79:
if( buf[3]==0x01 && buf[7]==0x3c) //buf[3]==0x01 是用户指令01 只判定buf[3]
{
memset(buf, 0, 16)
**********此处省略**********
}
if( buf[3]==0x02 && buf[7]==0x3c)
{
memset(buf, 0, 16)
**********此处省略**********
}
if( buf[3]==0x03 && buf[7]==0x3c)
{
memset(buf, 0, 16)
**********此处省略**********
}
if( buf[3]==0x04 && buf[7]==0x3c)
{
memset(buf, 0, 16)
**********此处省略**********
}
......................
总共15个IF判断
break;
case 0X78: //对应该抬起 指令 78后进行比较
if(buf[0]==0xAA && buf[7]==0x3c) // 接收完成
{
for(i=0;i<16;i++) //清空缓存区
{
buf[ i]=0;
}
//memset(buf, 0, 16) //清空缓存区 感觉这个函数比较费时,所以没用 ,求指教
}
break;
default:break;
}
}
目前程序运行正常。
请问,如果数据接收慢,当case 0X79: 跑完了,用户指令才来,或者我要比较指令01 。但可能跑到03去比较了。这时候 01 才到。那么这一次不执行。退出 case 0X79: 这时候缓存区未被清空,(此处为单次点击)
当抬起屏幕的时候指令78来了,会覆盖缓存区 ,然后 switch(buf[1]) 在while(1) 里一直调用。直到清空
(正常操作点击屏幕按下抬起不作停留 。屏幕下发数据是 AA 79********** AA 78 ********** 中间有很短的间隔)
这次点击那就无效了。
如果在case 0X79后面加上while (buf[7]!=0x3c) 防止没接收完就判断,会有多大影响。谢谢大家
|