单片机串口接收一串特定字符的程序,用串口调试助手发送命令,可是单片机不回 5
#include"reg52.h"#include"intrins.h"#defineuintunsignedint#defineucharunsignedcharbit...
#include "reg52.h"
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char
bit flag2;
uchar receive,k;
uchar buf[6],tab[11];
void init();
void wen();
void main()
{
uchar i;
init();
while(1)
{
if(flag2==1)
{
ES=0;
flag2=0;
wen();
SBUF=0X02;
while(!TI);
TI=0;
for(i=0;i<11;i++)
{
SBUF=tab[i];
while(!TI);
TI=0;
}
SBUF=0X03;
while(!TI);
TI=0;
while(1);
ES=1;
}
}
}
void init()
{
TMOD=0X20;
TH1=0XFd;
TL1=0XFd;
SCON=0X50;
PCON=0X00;
ES=1;
EA=1;
TR1=1;
}
void wen()
{
tab[0]=0x32;
tab[1]=0x34;
tab[2]=0x31;
tab[3]=0x30;
tab[4]=0x39;
tab[5]=0x32;
tab[6]=0x34;
tab[7]=0x32;
tab[8]=0x36;
tab[9]=0x37;
tab[10]=tab[0]+tab[1]+tab[2]+tab[3]+tab[4]+tab[5]+tab[6]+tab[7]+tab[8]+tab[9];
}
void rec() interrupt 4
{
bit flag1;
if(RI==1)
{
RI=0;
receive=SBUF;
if(receive==0x02)
{
flag1=1;
}
if(flag1==1)
{
buf[k]=receive;
k++;
if(receive==0X03)
{
flag1=0;
flag2=1;
k=0;
}
}
}
}
不好意思,我只有5分 展开
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char
bit flag2;
uchar receive,k;
uchar buf[6],tab[11];
void init();
void wen();
void main()
{
uchar i;
init();
while(1)
{
if(flag2==1)
{
ES=0;
flag2=0;
wen();
SBUF=0X02;
while(!TI);
TI=0;
for(i=0;i<11;i++)
{
SBUF=tab[i];
while(!TI);
TI=0;
}
SBUF=0X03;
while(!TI);
TI=0;
while(1);
ES=1;
}
}
}
void init()
{
TMOD=0X20;
TH1=0XFd;
TL1=0XFd;
SCON=0X50;
PCON=0X00;
ES=1;
EA=1;
TR1=1;
}
void wen()
{
tab[0]=0x32;
tab[1]=0x34;
tab[2]=0x31;
tab[3]=0x30;
tab[4]=0x39;
tab[5]=0x32;
tab[6]=0x34;
tab[7]=0x32;
tab[8]=0x36;
tab[9]=0x37;
tab[10]=tab[0]+tab[1]+tab[2]+tab[3]+tab[4]+tab[5]+tab[6]+tab[7]+tab[8]+tab[9];
}
void rec() interrupt 4
{
bit flag1;
if(RI==1)
{
RI=0;
receive=SBUF;
if(receive==0x02)
{
flag1=1;
}
if(flag1==1)
{
buf[k]=receive;
k++;
if(receive==0X03)
{
flag1=0;
flag2=1;
k=0;
}
}
}
}
不好意思,我只有5分 展开
2个回答
展开全部
//特定的字符,那就先弄好数据格式
//比如 你要接收4个ASII字符
//那就把帧设计成
//起始符-字节数-有效数据-结束符 等类似这种格式
//起始符一般订为不常用的 ASII 字符 ,结束符号也是比如$,#,@这些
//假设你要发送ASII的1 2 3 4,起始符-$,结束符-@
//那就要发送 $ 4 1 2 3 4 @ 。第一个4就是有效数据的个数。
里面的变量都是要全局变量因为每次进入中断,变量值不应该复位。
bit flag1=0,flag2;
uchar receive,lenth,i,job_flag;
在最开头定义这些变量
//这样你在编程的时候
void Send() interrupt 4
{
if(RI==1)
{
RI=0;
receive=SBUF;
switch(job_flag)
{
case 0:
if(receive=='$')//判断起始符号
{
job_flag=1;
}
break;
case 1: //判断接收数据长度
lenth=receive;
job_flag=2;
break;
case 2: //接收数据
if(i<lenth)//接收数据并保存到buf数组里
{
buf[i]=receive;
i++;
if(i>lenth)//如果接收的有效数据长度超过了说明数据有错误复位接收
{
i=0;
job_flag=0;
}
if(i==lenth)//接收完成,转到接收结束符
{
job_flag=3;
}
}
break;
case 3: //接收数据
if(receive=='@')//判断结束付-复位接收状态
{
i=0;
job_ flag=0;
flag_RI=1;//接收成功标志位
}
break;
default:
i=0;
job_ flag=0;
flag_RI=0;
break;
}
}
if(TI==1)
{
TI=0;
flag_TI=0;
}
}
//比如 你要接收4个ASII字符
//那就把帧设计成
//起始符-字节数-有效数据-结束符 等类似这种格式
//起始符一般订为不常用的 ASII 字符 ,结束符号也是比如$,#,@这些
//假设你要发送ASII的1 2 3 4,起始符-$,结束符-@
//那就要发送 $ 4 1 2 3 4 @ 。第一个4就是有效数据的个数。
里面的变量都是要全局变量因为每次进入中断,变量值不应该复位。
bit flag1=0,flag2;
uchar receive,lenth,i,job_flag;
在最开头定义这些变量
//这样你在编程的时候
void Send() interrupt 4
{
if(RI==1)
{
RI=0;
receive=SBUF;
switch(job_flag)
{
case 0:
if(receive=='$')//判断起始符号
{
job_flag=1;
}
break;
case 1: //判断接收数据长度
lenth=receive;
job_flag=2;
break;
case 2: //接收数据
if(i<lenth)//接收数据并保存到buf数组里
{
buf[i]=receive;
i++;
if(i>lenth)//如果接收的有效数据长度超过了说明数据有错误复位接收
{
i=0;
job_flag=0;
}
if(i==lenth)//接收完成,转到接收结束符
{
job_flag=3;
}
}
break;
case 3: //接收数据
if(receive=='@')//判断结束付-复位接收状态
{
i=0;
job_ flag=0;
flag_RI=1;//接收成功标志位
}
break;
default:
i=0;
job_ flag=0;
flag_RI=0;
break;
}
}
if(TI==1)
{
TI=0;
flag_TI=0;
}
}
追问
我用串口调试助手发送02 32 34 31 97 03,还是没有回复
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询