关于51单片机SBUF问题

void main()
{
chushi();
while(1)
{
if(flag)
{
ES=0; //标志位确定是否收到数据
flag=0;
for(i=0;i<6;i++)
{
SBUF=table[i];
while(!TI);
TI=0;
}
SBUF=a[j++];
while(!TI);
TI=0;
SBUF=' ';
while(!TI);
TI=0;
ES=1;

}

这是通讯程序的一部分,我有不理解是SUBF只能存一个字节,那么FOR循环怎么把多个字节存进去了.

它内部到底是怎样工作的,只说接收数据的SBUF就好了

SBUF是单片机硬件的串口接收、发送缓存器,软件往SBUF写入数据后,会自动触发单片机硬件的数据发送,发送完毕后硬件将TI 置1,软件等到TI为1后将其清0,并进行下次发送,即再次写入SBUF。
接收数据时,硬件将接收到的数据放入SBUF,并置为SI标志位,软件可使用中断触发或轮询机制发现SI的变化,将数据从SBUF读出,存入设计的目标存储单元。
具体可参考单片机串口部分的手册。追问

但它只能接收一个字节,那FOR循环中是多个字节,那是怎样理解呢?

追答

For循环是一步一步的执行的啊,循环一次发送一个字节啊。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-09-17
上面的应该是发送程序,SBUF只能发送或接受一个字节,也用不到FOR循环,接受的时候最好有一个判断字节长度的变量,比如定义一个Rxd_Number,具体程序可参考下面
void UsartData(void) interrupt 4 using 2
{
ES = 0; //关串口中断
if(RI)
{
RI = 0;
if(Rxd_Count < Rxd_Number)
{
receive_data[i] = SBUF;
Rxd_Count ++;
}
}
ES = 1;

}追问

为什么要先关掉串口中断再打开,对接受数据是否有形响,网上有部分人说关掉串口中断会引起数据丢失的情况, 其实上位机发送数据给单片机是按规定时间连续发送么?不管你如何设置程序

本回答被网友采纳
相似回答