|
關(guān)于51單片機串口通信 中斷服務(wù)函數(shù)處理數(shù)據(jù)問題,希望前輩們可以幫忙看看,指點一二...在此表示感謝用的單片機是STC8A8K 在中斷服務(wù)函數(shù)里 開了8個數(shù)組進行保存上位機發(fā)下來的8個數(shù)組,處理數(shù)據(jù)是在中斷服務(wù)函數(shù)里處理的.用的是狀態(tài)機的思想.開兩個數(shù)組的時候沒什么太大的問題,開了8個數(shù)組就卡死了.想請教一下前輩們怎么解決這個問題啊? 把數(shù)據(jù)處理放在主函數(shù)嘛? 還是重新定義一個函數(shù)呢? 我試了試,沒能移植成功,希望前輩們能給點建議 晚輩不勝感激.
中斷服務(wù)函數(shù)代碼如下:(每個數(shù)組有兩個幀頭 一個幀尾)
void uart_ISR() interrupt 4
{unsigned int recv_data;
if(RI)
{ RI=0;
recv_data=SBUF;
switch(machine_step_0)
{//接收數(shù)據(jù)存入第1個數(shù)組
case 0:
if(recv_data==0xAA)
{machine_step_0=1;}
else
{machine_step_0=0;}
break;
case 1:
if(recv_data==0x55)
{machine_step_0=2;
recv_cnt_0=0;
}
else
{machine_step_0=0;}
break;
case 2:
if(recv_data!=0x0A)
{ recv_buf_0[recv_cnt_0]=recv_data;
recv_cnt_0++;
}
else
{
machine_step_0=3;
}
break;
//接收數(shù)據(jù)存入第2個數(shù)組
case 3:
if(recv_data==0xBB)
{
machine_step_0=4;
}
else
{
machine_step_0=0;
}
break;
case 4:
if(recv_data==0x44)
{
machine_step_0=5;
recv_cnt_1=0;
}
else
{
machine_step_0=0;
}
break;
case 5:
if(recv_data!=0x0B)
{
recv_buf_1[recv_cnt_1]=recv_data;
recv_cnt_1++;
}
else
{
machine_step_0=6;
}
break;
//接收數(shù)據(jù)存入第3個數(shù)組
case 6:
if(recv_data==0xCC)
{
machine_step_0=7;
}
else
{
machine_step_0=0;
}
break;
case 7:
if(recv_data==0x33)
{
machine_step_0=8;
recv_cnt_2=0;
}
else
{
machine_step_0=0;
}
break;
case 8:
if(recv_data!=0x0C)
{
recv_buf_2[recv_cnt_2]=recv_data;
recv_cnt_2++;
}
else
{
machine_step_0=9;
}
break;
//接收數(shù)據(jù)存入第4個數(shù)組
case 9:
if(recv_data==0xDD)
{
machine_step_0=10;
}
else
{
machine_step_0=0;
}
break;
case 10:
if(recv_data==0x22)
{
machine_step_0=11;
recv_cnt_3=0;
}
else
{
machine_step_0=0;
}
break;
case 11:
if(recv_data!=0x0D)
{
recv_buf_3[recv_cnt_3]=recv_data;
recv_cnt_3++;
}
else
{
machine_step_0=12;
}
break;
//接收數(shù)據(jù)存入第5個數(shù)組
case 12:
if(recv_data==0xEE)
{led=0;
machine_step_0=13;
}
else
{
machine_step_0=0;
}
break;
case 13:
if(recv_data==0x11)
{
machine_step_0=14;
recv_cnt_4=0;
}
else
{
machine_step_0=0;
}
break;
case 14:
if(recv_data!=0x0E)
{
recv_buf_4[recv_cnt_4]=recv_data;
recv_cnt_4++;
}
else
{
machine_step_0=15;
}
break;
//接收數(shù)據(jù)存入第6個數(shù)組
case 15:
if(recv_data==0xFF)
{
machine_step_0=16;
}
else
{
machine_step_0=0;
}
break;
case 16:
if(recv_data==0x55)
{
machine_step_0=17;
recv_cnt_5=0;
}
else
{
machine_step_0=0;
}
break;
case 17:
if(recv_data!=0x0F)
{
recv_buf_5[recv_cnt_5]=recv_data;
recv_cnt_5++;
}
else
{
machine_step_0=18;
}
break;
//接收數(shù)據(jù)存入第7個數(shù)組
case 18:
if(recv_data==0xAB)
{
machine_step_0=19;
}
else
{
machine_step_0=0;
}
break;
case 19:
if(recv_data==0x44)
{
machine_step_0=20;
recv_cnt_6=0;
}
else
{
machine_step_0=0;
}
break;
case 20:
if(recv_data!=0x1A)
{
recv_buf_6[recv_cnt_6]=recv_data;
recv_cnt_6++;
}
else
{
machine_step_0=21;
}
break;
//接收數(shù)據(jù)存入第8個數(shù)組
case 21:
if(recv_data==0xCD)
{
machine_step_0=22;
}
else
{
machine_step_0=0;
}
break;
case 22:
if(recv_data==0x33)
{
machine_step_0=23;
recv_cnt_7=0;
}
else
{
machine_step_0=0;
}
break;
case 23:
if(recv_data!=0x1B)
{
recv_buf_7[recv_cnt_7]=recv_data;
recv_cnt_7++;
}
else
{
recv_cnt_0=0;
recv_cnt_1=0;
machine_step_0=0;
recv_flag_0=1;
led1=0;
}
break;
default:break;
}}
if(TI)
{TI=0;}
}
|
|