51单片机串口程序在接收了数据后就不能正常发送了,帮忙看下代码有没有问题?

#include<reg52.h>

typedef unsigned int u16;
typedef unsigned char u8;

#define led P2
sbit beep=P1^5;
sbit key=P3^2;
sbit oled=P2^2;

u8 recData[10];
u8 ok[10]="\r\nIt's ok!";
u8 cipmux[20]="AT+CIPMUX=1";
u8 cipserver[14]="AT+CIPSERVER=1";

void delay(u16 time){
u16 i,n;
for(i=0;i<time;i++){
for(n=0;n<120;n++);
}
}
void UsartInit()
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //计数器初始值设置,注意波特率是4800的
TL1=0XF3;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
TI=1;
}

void sendData(u8 dataArr[],u16 num){

u16 i=0;
for(i=0;i<num;i++){
SBUF=dataArr[i];
while(!TI);
}

}

void wifiInit(){

sendData(cipmux,11);
delay(500);
sendData(cipserver,14);
delay(500);

}

void main(){
u8 cNum,i=0;
UsartInit();
while(key);
delay(10);
if(key==0){
wifiInit(); //此行代码能正常发送数据
}
sendData(ok,10); //此行代码能正常发送数据
while(1){
for(i=0;i<10;i++){
while(!RI);
recData[i]=SBUF;
}
sendData(ok,9); //此行代码不能正常发送数据,原本应该发送的“It's ok,结果只发了个 I 之后就没反应了”
}
}

void Usart() interrupt 4
{
if(RI){
RI=0;
}
if(TI){
TI=0;
}
}

while(!RI),决定了它每收到一个字节,发出“It's ok!”中的一个字符,而且,RI会导致中断,中断后RI又=0,很可能,即使收到一个字节,也等不到RI=1,也就不发出下一个字符追问

找到问题了,是sendData()函数里面的while(!TI),是TI产生了中断之后立马变为TI=0,而while(!TI)还没来得及判断就已经被置0了,所以永远等不到TI=1

温馨提示:答案为网友推荐,仅供参考
第1个回答  2021-05-14
while(1){
for(i=0;i<10;i++){
while(!RI);
RI = 0;加上试试;

void Usart() interrupt 4
{
//if(RI){
//RI=0;
//}
//if(TI){
//TI=0;
//}
}追问

接收数据是没有问题的,是发送数据上面出了问题,不过你们都给了我解决问题的思路哈,谢谢啦

追答

解决了就不采纳了?

相似回答