串口中断函数(求解释)

初学,看到串口通信这块,有个串口中断接收函数有个地方迷惑不解,求解释。
void serial_serve(void) interrupt 4 //定义函数名为serial_serve的串口接收中断{
uint temp;
RI=0; //清除接收标志
EA=0; //关闭总中断
temp=SBUF; //将接收到的信息存放在temp中
switch(cnt)
{
case 0:if(temp=='#')cnt=1;else outflag=0;break;
case 1:if((temp>0x30)&&(temp<0x39)){a[0]=temp-0x30;cnt=2;}else outflag=0;break;
case 2:if(temp=='(')cnt=3;else outflag=0;break;
case 3:if((temp>=0x30)&&(temp<=0x38)){a[1]=temp-0x30;cnt=4;}else outflag=0;break;
case 4:if(temp==')'){cnt=0;outflag=1;}else outflag=0;break;
default:break;
}
EA=1; //打开总中断

假如上位机发送的是#1(1),那么函数中的SBUN接收到的信息给了temp,此时的temp是#1(1) 呢还是 # 呢?
为什么 case 0语句中的temp是#,而case 1语句中的temp 就是第2个字符1,case 2语句中的 temp就是判断第三个字符 ( 了呢?
函数中有个地方错了,uint temp;应为 uchar temp; uchar在前面已经声明过了 是unsigend char

第1个回答  推荐于2016-05-26
单片机的吧。
单片机的SBUF缓冲区一般只有一个字节(即1Byte)=8bit。通常字符是用ASCII码值表示的也占1Byte。所以一般的单片机一次只能接收一个字符。因此这里的temp是'#'。
综上所述要接收完“#1(1)”需要进入5次中断。所以用cnt来记录中断的次数。所以就有了
case 0中 temp="#"
case 1中 temp="1"
....本回答被提问者采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网