微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 新手求问:串口通讯,接收和发送冲突?

新手求问:串口通讯,接收和发送冲突?

时间: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;
}  
}

代码一的运行图,到最高温度就停住了


代码二可以按要求运行


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top