|
單片機(jī)與觸控屏通信 按下屏幕下發(fā) AA 79 ** ** 33 cc c3 3c 抬起屏幕下發(fā) AA 78 ** ** 33 cc c3 3c 中間兩個(gè)字節(jié)用戶定義相同指令
以下部分代碼
uchar buf[16]; //接收緩存區(qū) 這里因?yàn)樯想娢帐肿畲箝L度,所以給了16 下面程序只用到8個(gè)字節(jié)
uchar rp = 0; //緩存區(qū)地址
void interrupt_uart() interrupt 4 //using 3 //串口接收,定時(shí)器2 115200
{
if (RI)
{
RI = 0 ;
buf[ rp++ ] = SBUF;
if(SBUF==0X3C) //接收到尾 地址復(fù)位
rp=0;
}
}
void key_service() //放在大循環(huán) while(1) 里一直調(diào)用
{
switch(buf[1]) //對(duì)應(yīng)該按下 指令 79后進(jìn)行比較
{
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個(gè)IF判斷
break;
case 0X78: //對(duì)應(yīng)該抬起 指令 78后進(jìn)行比較
if(buf[0]==0xAA && buf[7]==0x3c) // 接收完成
{
for(i=0;i<16;i++) //清空緩存區(qū)
{
buf[ i]=0;
}
//memset(buf, 0, 16) //清空緩存區(qū) 感覺這個(gè)函數(shù)比較費(fèi)時(shí),所以沒用 ,求指教
}
break;
default:break;
}
}
目前程序運(yùn)行正常。
請(qǐng)問,如果數(shù)據(jù)接收慢,當(dāng)case 0X79: 跑完了,用戶指令才來,或者我要比較指令01 。但可能跑到03去比較了。這時(shí)候 01 才到。那么這一次不執(zhí)行。退出 case 0X79: 這時(shí)候緩存區(qū)未被清空,(此處為單次點(diǎn)擊)
當(dāng)抬起屏幕的時(shí)候指令78來了,會(huì)覆蓋緩存區(qū) ,然后 switch(buf[1]) 在while(1) 里一直調(diào)用。直到清空
(正常操作點(diǎn)擊屏幕按下抬起不作停留 。屏幕下發(fā)數(shù)據(jù)是 AA 79********** AA 78 ********** 中間有很短的間隔)
這次點(diǎn)擊那就無效了。
如果在case 0X79后面加上while (buf[7]!=0x3c) 防止沒接收完就判斷,會(huì)有多大影響。謝謝大家
|
|