單片機與觸控屏通信 按下屏幕下發 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) 防止沒接收完就判斷,會有多大影響。謝謝大家
|