SBUF发送完后,是自动清零吗?

2025-02-24 18:40:45
推荐回答(2个)
回答1:

//串口发送
void sbuf_in(uchar i) //串口接收
{ ES=0; //串口接收启动
TI = 0; //清零串口发送完成中断请求标志
SBUF = i;
while(TI ==0); //等待发送完成
TI = 0; //清零串口发送完成中断请求标志
delay (2); //需要延时不然连续发送可能会出问题
ES=1; //串口接收启动
}

//串口中断
void serial() interrupt 4
{
if(RI==1)
{ RI = 0;
//sbuf_data_1=SBUF;
if(SBUF==sbuf_tou) //头文件
{ while(RI==0)

RI=0;sbuf_data_1=SBUF; //二位数据代表
while(RI==0)

RI=0;sbuf_data_2=SBUF; //二位数据代表
while(RI==0)

RI=0;sbuf_data_3=SBUF; //三位数据代表
while(RI==0)

RI=0;sbuf_data_4=SBUF; //四位数据代表校验位
sbuf_biao=1;
}
else

}
else

}
两个函数分开就可以了
你直接调用sbuf_in这个函数发送就可以了

回答2:

串口数据发送和接收是一个字节一个字节传输的,所以你发送或者接收一个字节后,要等待RI或TI置位,然后清零再发下一个字节,你这样连续发容易出错的。SBUF只能存放一个字节的数据。
stro2int程序:
int str2int(char* str)
{
int nRet = 0;
int i = 0;
while (str[i] != ';')
{
nRet = nRet*10 + str[i] - '0';
i++;
}
return nRet;
}
你这个函数的意思是将数组的每个元素给nRet吧,你这里重复给nRet赋值了