新手求问:串口通讯,接收和发送冲突?
时间:10-02
整理:3721RD
点击:
(代码一)这个程序最初的作用是 先给命令输入指令 用串口助手16进制输入1后 就输入最高温度 输入后 再输入最低温度 ,但实际的结果是 在输入最高问题的过程中,不论发送几个字节,程序都不往下走了,我发现是停在while(j!=N);但用代码二是可以运行的 求解为什么会出现这样的情况。
对于实现这功能有更好的思路吗?
代码一:
#include<reg52.h>
#include<stdio.h>
#include<stdlib.h>
#define uchar unsigned char
#define uint unsigned int
//延时函数
void delay(uint a)
{
uint i;
for(;a>0;a--)
for(i=110;i>0;i--);
}
//串口初始化
void init()
{
//设置波特率
//打开串口中断
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
EA=1;
ES=1;
SCON=0x50;
}
//主函数
#define N 2
uchar flag;//填满标志
uchar flag_get;//获得标志
uchar TEMP[N];
uchar j=0;
uchar flag_set_temp;
void warn()
{
float a,b;
flag_set_temp=1;
flag=0;
delay(1000);
TI=1;
puts("输入设定最高温度");
while(!TI);
TI=0;
while(j!=N);
a=atof(TEMP);
flag=0;
j=0;
TI=1;
puts("输入设定最低温度");
while(!TI);
TI=0;
while(j!=N);
b=atof(TEMP);
flag=0;
flag_set_temp=0;
TI=1;
printf("MAX TEMP IS %f \n",a);
while(!TI);
TI=1;
printf("MIN TEMP IS %f \n",b);
while(!TI);
TI=0;
}
uchar a;
void main()
{
init();
delay(1000);
ES=0;
TI=1;
puts("输入命令");
while(!TI);
TI=0;
ES=1;
flag_get=0;
while(1)
{
if(flag_get==1)
{
flag_get=0;
ES=0; //关闭串口中断
switch(a)
{
case 0x01:warn();break;
default: TI=1;puts("ERROR!");while(!TI);TI=0;break;
}
ES=1;
}
}
}
void com() interrupt 4
{
if(RI)
{
if(flag_set_temp==1)
{
TEMP[j++]=SBUF;
if(j==N)
flag=1;
}
// delay(50);
else
{
flag_get=1;
a=SBUF;
}
RI=0;
}
}
代码二
#include<reg52.h>
#include<stdio.h>
#include<stdlib.h>
#define uchar unsigned char
#define uint unsigned int
//延时函数
void delay(uint a)
{
uint i;
for(;a>0;a--)
for(i=110;i>0;i--);
}
//串口初始化
void init()
{
//设置波特率
//打开串口中断
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
EA=1;
ES=1;
SCON=0x50;
}
//串口发送字符串给PC
void sent_string(uchar *a)
{
do
{
SBUF=*a++;
while(!TI);
TI=0;
}while(*a);
}
//串口读取字符串给PC
//主函数
#define N 2
uchar flag;//填满标志
uchar flag_get;
uchar TEMP[N];
uchar j=0;
uchar flag_set_temp;
void warn()
{
float a,b;
flag_set_temp=1;
flag=0;
delay(1000);
TI=1;
puts("输入设定最高温度");
while(!TI);
TI=0;
while(j!=N);
a=atof(TEMP);
flag=0;
j=0;
TI=1;
puts("输入设定最低温度");
while(!TI);
TI=0;
while(j!=N);
b=atof(TEMP);
flag=0;
flag_set_temp=0;
TI=1;
printf("MAX TEMP IS %f \n",a);
while(!TI);
TI=1;
printf("MIN TEMP IS %f \n",b);
while(!TI);
TI=0;
}
uchar a;
void main()
{
init();
delay(1000);
warn();
}
void com() interrupt 4
{
if(RI)
{
if(flag_set_temp==1)
{
TEMP[j++]=SBUF;
if(j==N)
flag=1;
}
RI=0;
}
}
对于实现这功能有更好的思路吗?
代码一:
#include<reg52.h>
#include<stdio.h>
#include<stdlib.h>
#define uchar unsigned char
#define uint unsigned int
//延时函数
void delay(uint a)
{
uint i;
for(;a>0;a--)
for(i=110;i>0;i--);
}
//串口初始化
void init()
{
//设置波特率
//打开串口中断
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
EA=1;
ES=1;
SCON=0x50;
}
//主函数
#define N 2
uchar flag;//填满标志
uchar flag_get;//获得标志
uchar TEMP[N];
uchar j=0;
uchar flag_set_temp;
void warn()
{
float a,b;
flag_set_temp=1;
flag=0;
delay(1000);
TI=1;
puts("输入设定最高温度");
while(!TI);
TI=0;
while(j!=N);
a=atof(TEMP);
flag=0;
j=0;
TI=1;
puts("输入设定最低温度");
while(!TI);
TI=0;
while(j!=N);
b=atof(TEMP);
flag=0;
flag_set_temp=0;
TI=1;
printf("MAX TEMP IS %f \n",a);
while(!TI);
TI=1;
printf("MIN TEMP IS %f \n",b);
while(!TI);
TI=0;
}
uchar a;
void main()
{
init();
delay(1000);
ES=0;
TI=1;
puts("输入命令");
while(!TI);
TI=0;
ES=1;
flag_get=0;
while(1)
{
if(flag_get==1)
{
flag_get=0;
ES=0; //关闭串口中断
switch(a)
{
case 0x01:warn();break;
default: TI=1;puts("ERROR!");while(!TI);TI=0;break;
}
ES=1;
}
}
}
void com() interrupt 4
{
if(RI)
{
if(flag_set_temp==1)
{
TEMP[j++]=SBUF;
if(j==N)
flag=1;
}
// delay(50);
else
{
flag_get=1;
a=SBUF;
}
RI=0;
}
}
代码二
#include<reg52.h>
#include<stdio.h>
#include<stdlib.h>
#define uchar unsigned char
#define uint unsigned int
//延时函数
void delay(uint a)
{
uint i;
for(;a>0;a--)
for(i=110;i>0;i--);
}
//串口初始化
void init()
{
//设置波特率
//打开串口中断
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
EA=1;
ES=1;
SCON=0x50;
}
//串口发送字符串给PC
void sent_string(uchar *a)
{
do
{
SBUF=*a++;
while(!TI);
TI=0;
}while(*a);
}
//串口读取字符串给PC
//主函数
#define N 2
uchar flag;//填满标志
uchar flag_get;
uchar TEMP[N];
uchar j=0;
uchar flag_set_temp;
void warn()
{
float a,b;
flag_set_temp=1;
flag=0;
delay(1000);
TI=1;
puts("输入设定最高温度");
while(!TI);
TI=0;
while(j!=N);
a=atof(TEMP);
flag=0;
j=0;
TI=1;
puts("输入设定最低温度");
while(!TI);
TI=0;
while(j!=N);
b=atof(TEMP);
flag=0;
flag_set_temp=0;
TI=1;
printf("MAX TEMP IS %f \n",a);
while(!TI);
TI=1;
printf("MIN TEMP IS %f \n",b);
while(!TI);
TI=0;
}
uchar a;
void main()
{
init();
delay(1000);
warn();
}
void com() interrupt 4
{
if(RI)
{
if(flag_set_temp==1)
{
TEMP[j++]=SBUF;
if(j==N)
flag=1;
}
RI=0;
}
}
代码一的运行图,到最高温度就停住了

代码二可以按要求运行

