串口运行时如果接收到的不是想要的字符串应该怎么处理,以免干扰到后面的程序运行
时间:10-02
整理:3721RD
点击:
刚进公司,老板就让写治具的控制板。
电气动作方面已经没有问题。现在的问题是串口通讯有问题:
上位机会不停的发送TEST询问信号,如果我单片机start=0时,会发送DUT_n_start信号,上位机就会开始测试,单片机为跳入while循环等待串口接收到来自上位机的PASS或FAIL信号,
现在的问题是上位机在测试过程中还是会不停的扫描发送TEST询问信号,如果我等待过程中接收了TEST信号,我的程序后面就接收不到PASS或FAIL信号,程序就没法向下运行了。
我在等待状态加了筛选信号的函数,但是又有新情况,现在虽然能接收到PASS或FAIL信号,但是没法确定上位机在第几次发送PASS或FAIL时我会接收到,有时1次就接收到了,有时候要好几次才接收到,我现在用串口助手是可以发送无限次,但是到时候上位机测试软件只会发送一次测试结果的信号,如果单片机接收不到,程序就相当于死机了。
我的程式哪里有问题,请大神指点一下,改了两天了,还是有问题。我觉得是我串口接收模块写的有问题,但不知道怎么改
void main()
{
put_down=1; //确认下压汽缸处于升起状态
init();
delay(500);
while(1)
{
flag_cy =0; //光栅中断标志位置0
EX0 =1; //光栅中断打开(INT0)
count=0; //串口缓冲区计数清零
delay(100);
if(Flag==1&&c==1) //收到RESET信号
{
SendStr("RESET"); //系统复位
ISP_CTL =0x60;
}
if(start==0) //按下开始按键
{
_nop_();
if(start==0) //去抖动延时
{
_nop_();
if(start==0) //按下开始按键
{
flag_cy=0;
put_down=0; //治具下压 ,动作持续1秒
delay(1000);
delay(1000);
pass=1; //PASS信号灯保持熄灭
fail=1; //FAIL信号灯保持熄灭
testing=0; //Testing信号灯亮,表明正在测试
Flag=0; //串口接收标志清零
d=0;
while(1)
{
if(Flag==1&&d==1) //假如收到上位机询问“是否开测试”信号,就向上位机发送DUT——START信号
{
p=text1;
SendStr(p);
count=0;
Flag=0;
d=0;
break;
}
}
delay(1000); //测试中,黄灯亮
delay(1000);
delay(1000); //测试中,黄灯亮
delay(1000);
delay(1000); //测试中,黄灯亮
delay(1000);
delay(1000); //测试中,黄灯亮
delay(1000);
EX0 =0;
if(Flag==1&&c==1) //收到RESET信号
{
ISP_CTL =0x60;
}
while(1) //这一段就是上位机测试时我单片机在这个循环中等待,主要问题就是这段和串口中断
{
SendStr("WAIT");
delay(30000);
if(Flag==1&&a==1)
{
count=0;
SendStr("pass?");
break;
}
if(Flag==1&&b==1)
{
count=0;
SendStr("fail?");
break;
}
if(Flag==1&&c==1)
{
count=0;
SendStr("RE?");
break;
}
else
{
count=0;
SendStr("clear");
delay(20000);
EA=0;
Flag=0;
for(count=0;count<8;count++)
{
BUF[count]=0;
}
count=0;
d=0;
EA=1;
}
}
while(1)
{
if(Flag==1&&a==1) //收到PASS信号
{
SendStr("PASS");
count=0;
Flag=0;
a=0;
put_down=1; //解除下压
testing=1; //黄灯灭
pass=0; //绿灯亮
buzzer=0; //蜂鸣器响一声
delay(1000);
buzzer=1;
EX0 =1;
break;
}
if(Flag==1&&b==1) //收到FAIL信号
{
SendStr("FAIL");
count=0;
Flag=0;
b=0;
testing=1; //黄灯灭
fail=0;
buzzer=0; //蜂鸣器响一声
delay(2000);
delay(1000);
buzzer=1;
delay(2000);
delay(1000);
buzzer=0; //蜂鸣器响一声
delay(2000);
delay(1000);
buzzer=1;
delay(2000);
delay(1000);
buzzer=0; //蜂鸣器响一声
delay(2000);
delay(1000);
buzzer=1;
EX0 =1;
break;
}
if(Flag==1&&c==1) //收到RESET信号
{
SendStr("RESETC");
ISP_CTL =0x60;
}
if(flag_cy==1) //如果外部中断标志位为1.
{
SBUF = 'G';
while(!TI);
TI =1;
fail= 1;
pass=1;
testing=1;
flag_cy=0;
break;
}
}
}
}
}
}
}
void init()
{
count=0;
Flag=0;
a=0;
b=0;
c=0;
EA = 1; //总中断允许
TMOD = 0x20; //设置波特率为9600和定时器1工作方式
TL1 = 0xFD; //设置初始值
TH1 = 0xFD;
SCON = 0x50; //设置串行口工作方式,波特率。
PCON = 0x00;
TR1 = 1; //允许发送
IT0=0; //INT0中断允许 下降沿触发
EX0 =1;
ET0 = 1; //启动定时器
ES = 1; //串行中断允许
}
void SendByte(uchar dat) //串口发送字符函数
{
SBUF = dat;
while(!TI);
TI = 0;
}
void SendStr(uchar *p) //串口发送字符串嵌套函数
{
while(*p!='\0')
{
SendByte(*p);
SBUF= *p++;
}
}
void delay(uchar time) //延时
{
uint a;
uint b;
for(a=0;a<time;a++)
{
for(b=0;b<110;b++);
}
}
void int0(void) interrupt 0 //电平触发 外部中断0,光栅
{
EX0 = 0;
ISP_CTL =0x60;
EX0 = 1;
}
void Receive(void) interrupt 4 //串口中断 串口中断,我觉得这里写法可能有问题
{
ES = 0;
if (RI == 1)
{
RI = 0;
if(count<8)
{
BUF[count++] = SBUF;
if((BUF[0]=='P')&&(BUF[5]=='2')) //如果接收到PASS_N信号
{
Flag=1;
a=1;
}
if((BUF[0]=='F')&&(BUF[5]=='2')) //如果接收到FAIL_N信号
{
Flag=1;
b=1;
}
if((BUF[0]=='R')&&(BUF[6]=='2')) //如果接收到RESET_N信号
{
Flag=1;
c=1;
}
if(BUF[0]=='T') //如果接收到上位机询问GET_TEST信号
{
// ES=0;
Flag=1;
d=1;
// count =0;
// ES=1;
}
else
{
count =0;
Flag=0; // 关闭串口中断,停止接收
// TI=0;
}
}
}
else
{
TI =0;
}
ES = 1;
}
电气动作方面已经没有问题。现在的问题是串口通讯有问题:
上位机会不停的发送TEST询问信号,如果我单片机start=0时,会发送DUT_n_start信号,上位机就会开始测试,单片机为跳入while循环等待串口接收到来自上位机的PASS或FAIL信号,
现在的问题是上位机在测试过程中还是会不停的扫描发送TEST询问信号,如果我等待过程中接收了TEST信号,我的程序后面就接收不到PASS或FAIL信号,程序就没法向下运行了。
我在等待状态加了筛选信号的函数,但是又有新情况,现在虽然能接收到PASS或FAIL信号,但是没法确定上位机在第几次发送PASS或FAIL时我会接收到,有时1次就接收到了,有时候要好几次才接收到,我现在用串口助手是可以发送无限次,但是到时候上位机测试软件只会发送一次测试结果的信号,如果单片机接收不到,程序就相当于死机了。
我的程式哪里有问题,请大神指点一下,改了两天了,还是有问题。我觉得是我串口接收模块写的有问题,但不知道怎么改
void main()
{
put_down=1; //确认下压汽缸处于升起状态
init();
delay(500);
while(1)
{
flag_cy =0; //光栅中断标志位置0
EX0 =1; //光栅中断打开(INT0)
count=0; //串口缓冲区计数清零
delay(100);
if(Flag==1&&c==1) //收到RESET信号
{
SendStr("RESET"); //系统复位
ISP_CTL =0x60;
}
if(start==0) //按下开始按键
{
_nop_();
if(start==0) //去抖动延时
{
_nop_();
if(start==0) //按下开始按键
{
flag_cy=0;
put_down=0; //治具下压 ,动作持续1秒
delay(1000);
delay(1000);
pass=1; //PASS信号灯保持熄灭
fail=1; //FAIL信号灯保持熄灭
testing=0; //Testing信号灯亮,表明正在测试
Flag=0; //串口接收标志清零
d=0;
while(1)
{
if(Flag==1&&d==1) //假如收到上位机询问“是否开测试”信号,就向上位机发送DUT——START信号
{
p=text1;
SendStr(p);
count=0;
Flag=0;
d=0;
break;
}
}
delay(1000); //测试中,黄灯亮
delay(1000);
delay(1000); //测试中,黄灯亮
delay(1000);
delay(1000); //测试中,黄灯亮
delay(1000);
delay(1000); //测试中,黄灯亮
delay(1000);
EX0 =0;
if(Flag==1&&c==1) //收到RESET信号
{
ISP_CTL =0x60;
}
while(1) //这一段就是上位机测试时我单片机在这个循环中等待,主要问题就是这段和串口中断
{
SendStr("WAIT");
delay(30000);
if(Flag==1&&a==1)
{
count=0;
SendStr("pass?");
break;
}
if(Flag==1&&b==1)
{
count=0;
SendStr("fail?");
break;
}
if(Flag==1&&c==1)
{
count=0;
SendStr("RE?");
break;
}
else
{
count=0;
SendStr("clear");
delay(20000);
EA=0;
Flag=0;
for(count=0;count<8;count++)
{
BUF[count]=0;
}
count=0;
d=0;
EA=1;
}
}
while(1)
{
if(Flag==1&&a==1) //收到PASS信号
{
SendStr("PASS");
count=0;
Flag=0;
a=0;
put_down=1; //解除下压
testing=1; //黄灯灭
pass=0; //绿灯亮
buzzer=0; //蜂鸣器响一声
delay(1000);
buzzer=1;
EX0 =1;
break;
}
if(Flag==1&&b==1) //收到FAIL信号
{
SendStr("FAIL");
count=0;
Flag=0;
b=0;
testing=1; //黄灯灭
fail=0;
buzzer=0; //蜂鸣器响一声
delay(2000);
delay(1000);
buzzer=1;
delay(2000);
delay(1000);
buzzer=0; //蜂鸣器响一声
delay(2000);
delay(1000);
buzzer=1;
delay(2000);
delay(1000);
buzzer=0; //蜂鸣器响一声
delay(2000);
delay(1000);
buzzer=1;
EX0 =1;
break;
}
if(Flag==1&&c==1) //收到RESET信号
{
SendStr("RESETC");
ISP_CTL =0x60;
}
if(flag_cy==1) //如果外部中断标志位为1.
{
SBUF = 'G';
while(!TI);
TI =1;
fail= 1;
pass=1;
testing=1;
flag_cy=0;
break;
}
}
}
}
}
}
}
void init()
{
count=0;
Flag=0;
a=0;
b=0;
c=0;
EA = 1; //总中断允许
TMOD = 0x20; //设置波特率为9600和定时器1工作方式
TL1 = 0xFD; //设置初始值
TH1 = 0xFD;
SCON = 0x50; //设置串行口工作方式,波特率。
PCON = 0x00;
TR1 = 1; //允许发送
IT0=0; //INT0中断允许 下降沿触发
EX0 =1;
ET0 = 1; //启动定时器
ES = 1; //串行中断允许
}
void SendByte(uchar dat) //串口发送字符函数
{
SBUF = dat;
while(!TI);
TI = 0;
}
void SendStr(uchar *p) //串口发送字符串嵌套函数
{
while(*p!='\0')
{
SendByte(*p);
SBUF= *p++;
}
}
void delay(uchar time) //延时
{
uint a;
uint b;
for(a=0;a<time;a++)
{
for(b=0;b<110;b++);
}
}
void int0(void) interrupt 0 //电平触发 外部中断0,光栅
{
EX0 = 0;
ISP_CTL =0x60;
EX0 = 1;
}
void Receive(void) interrupt 4 //串口中断 串口中断,我觉得这里写法可能有问题
{
ES = 0;
if (RI == 1)
{
RI = 0;
if(count<8)
{
BUF[count++] = SBUF;
if((BUF[0]=='P')&&(BUF[5]=='2')) //如果接收到PASS_N信号
{
Flag=1;
a=1;
}
if((BUF[0]=='F')&&(BUF[5]=='2')) //如果接收到FAIL_N信号
{
Flag=1;
b=1;
}
if((BUF[0]=='R')&&(BUF[6]=='2')) //如果接收到RESET_N信号
{
Flag=1;
c=1;
}
if(BUF[0]=='T') //如果接收到上位机询问GET_TEST信号
{
// ES=0;
Flag=1;
d=1;
// count =0;
// ES=1;
}
else
{
count =0;
Flag=0; // 关闭串口中断,停止接收
// TI=0;
}
}
}
else
{
TI =0;
}
ES = 1;
}
上位机协议里面没有反馈吗,只发一次的话由于各种原因可能会接收不到,这样的话让上位机继续发,单片机接收到以后发送一个反馈信号给上位机表示收到