今天试了一下串口通信、两个单片机。一个是发送端。产生流水灯。一个是接收端。接受发送端的流水灯信息、然后同步、
但是有问题出现了。
这个是发送代码;每100ms移动一次、同时发送一个信息给接收单片机
#include <reg52.h>
#include <intrins.h>
void sbufint()
{
EA=1;
TMOD=0X20;//定时器1;工作方式是2.常数自动转装载8位定时
TH1=253;
TL1=253;//初值
SCON=0x50;//工作方式1,波特率9600bit/s,允许接收
PCON=0x80;//模式控制
TR1=1;//启动定时器
}
void Delay100ms() //@11.0592MHz
{
unsigned char i, j;
i = 180;
j = 73;
do
{
while (--j);
} while (--i);
}
unsigned char SEND(unsigned char senddat)
{
SBUF=senddat;
while(TI==0);
TI=0;
return(0);
}
void main()
{
sbufint();
P1=0xfe;
while(1)
{
SEND(P1);
Delay100ms();
P1=_crol_(P1,1);
//P1=~P1;
}
}
这个是接受端代码;每150ms接受一次;
#include "reg52.h"
#include "intrins.h"
void sbufint()
{
EA=1;
TMOD=0X20;//定时器1;工作方式是2.常数自动转装载8位定时
TH1=253;
TL1=253;//初值
SCON=0x50;//工作方式1,波特率9600bit/s,允许接收
PCON=0x80;//模式控制
TR1=1;//启动定时器
}
void Delay150ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 7;
j = 78;
k = 167;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
unsigned char rec()
{
unsigned char recdat;
recdat=SBUF;
while(RI==0);
RI=0;
return(recdat);
}
void main()
{
sbufint();
while(1)
{
P1=rec();
Delay150ms();
}
}
但是实际上是这样子的。请看gif图
左边的那个是接收端,右边的那个是发送端’100ms流动一次;但是情况是这样子的。发送端:还是100ms移动一次。接受端:流水灯不是100ms。这个可以肯定。。。,但是竟然没有出现跳变;;也就说。接受端还是流水灯。就是时间间隔比发送端长一点而已、、、
怎么会出现这样的情况呢;;;;;好奇怪的事情呀;;难道是这样吗?
所以我就是想请教一下大家。关于sbuf的问题。。。为什么接收端还是流水灯。怎么不会发生跳位、、、、、、、、、1.sbuf里面的容量是8bit吗?sbuf里面的值是每接受一次的话,是重新擦写一次的吗?比如0ms是dat1;100ms的时候立即吧dat1擦除,由dat2覆盖。200ms的时候dat3覆盖dat2???????还是dat1和dat2在100ms的是偶同时存在,然后200ms的时候dat1,dat2 dat3是一直存在的。???????谢谢。请指教。
我就是想知道延迟了会出现什么问题;我故意设置150ms,我是认为会发生信息丢失。但是感觉没有丢失呀。你看那个gif图是接收端还是流水灯。要是信息丢失的话,应该会出现某个灯不会亮的,所以我怀疑像我这个图分析的那样;你看我的第二个图片。。。我觉得我这个分析比较符合现象,但是为什么不丢失呢?
追答应该说是数据阻塞,串口还是接收到数据了,但是每个数据是在每延迟150毫秒后再执行的
追问所以我就是想知道sbuf容量多大。阻塞之后data竟然还在;;;;;;;;;;我设置为300ms的时候是会出现跳位的。。。。。sbuf;;;容量 ;;;;这样我就会更加懂串口通信了。想搞懂
我是故意设置为150ms的。我就是想知道不会不会出现跳位;我那个图片我分析过。我觉得会出现调位,但是现象就是不出现。。。。http://g.hiphotos.baidu.com/zhidao/pic/item/d50735fae6cd7b898859c27c0e2442a7d9330e13.jpg 这个图片是我个人认为的,但是不知道为什么还是流水灯。一直都是;;
追答这样做是不靠谱的,因为用查询方式,发送端和接收端不能同步,因此,利用两者不同的延时来想跳位不好实现,这样做有什么目的吗?
追问目的就是为了看看查收和发送不同步的话,会不会丢失信息,可是事实不对劲呀,我个人认为信息会丢失,会出现调位。就是某个灯不亮;;对了我设置为300ms的时候是会出现调位的,现象很明显。但是为什么150ms不会呢?我就是觉得奇怪。。;然后我就是想搞清楚 sbuf的容量是有多大呀。比如说接收端的sbuf原本是dat1的话。第二次接受之后。是dat2覆盖了dat1 ,还是dat2和dat1同在
追答费了这大的劲就是搞清楚SBUF的容量啊,这个问题非常简单,也不必要这么折腾来验证啊。
1,SBUF就是一个8位的寄存器,发送时只能放一个字节,所以,为什么要这个字节发送完了才能再向SBUF送下一数,如果没有发送完再送下一下数的话,那后送的数就会覆盖原来的数,会出现原来的数发送了几位后又变成了后一个数的后几位了,就是乱了呀。
2,接收时也是一样,每次只能存放一个字节的接收的数据,即8位数,如果不及时将接收的数据取走,那么下一下接收的数据就会覆盖原来的数据,也就是替换了原来的数据,原来的数据不可能同在的。也就是原来的数据丢失了,所以,接收数据后不及时读取,就一定会有数据丢失的。
3,这些都是单片机教材讲的,很简单的么。
串口通信 关于sbuf的问题。
1、SBUF 是两个寄存器,名字虽然一样,发送的只能写,接受的只能读。2、SBUF收到数据会产生接收中断,接收中断产生后无法再接收其他数据,知道读取SBUF后将接收中断清零,因此 recdat=SBUF;while(RI==0);应该交换次序。3、未产生接收中断时,SBUF值并不固定,串口数据串行传入也是一位一位的改变的,可...
SBUF是什么意思?
SBUF是串行口中的两个缓冲寄存器的简称,其中之一是发送缓冲寄存器,另一个是接收缓冲寄存器。这两个寄存器在物理上是独立的,但它们共享同一个地址,通常为99H。在串行通信过程中,当CPU向SBUF写入数据时,表示正在发送数据;反之,当CPU从SBUF读取数据时,表示正在接收数据。SBUF的完整名称是Serial Data ...
关于51单片机SBUF的理解
1. SBTF实际上是由两个部分组成:一个用于读取接收字节,另一个用于写入发射字节。这两个部分共享同一个地址,因此在进行串口通信时需要特别注意。2. 在串口通信接收数据时,当接收到一个完整的字节,会产生一个接收中断标志,即RI(Receive Interrupt)自动由硬件置为1。此时,可以读取该字节。读取后的...
关于SBUF的用法不太理解,请高手指教...
1. SBUF是串行口缓冲寄存器,它由发送寄存器和接收寄存器组成,两者共享同一个名字和地址。2. 尽管它们共享名称和地址,但互不干扰,因为同一时刻只有一个寄存器可以进行读取或写入操作。3. 当单片机准备发送数据时,它会将数据放入SBUF的发送寄存器中。4. 若要使单片机能够接收数据,需要触发接收寄存器,这...
52单片机串口通信中sbuf的问题
串口中断程序:void ser() interrupt 4 { if(RI==1){ RI=0;for(m=0;m<4;m++)receive[m]=SBUF;} --- 这里,应该是有毛病的。每当发生接收中断,串口只是收到了一个字节而已;而你在中断函数里面,循环了四次,...应该只接收一次,然后修改指针,再设定个标志,通知主程序处理新数据。
关于SBUF的用法不太理解,请高手指教...
SBUF是串行口缓冲寄存器,包括发送寄存器和接收寄存器。他们有相同的名字和地址,但不会冲突,因为一个只能被读出,一个被写入。单片机把数据放到SBUF后,用到的是发送寄存器,你要想单片机接收到数据,接收寄存器要被触发,就是接收到PC机的数据,触发RI ...
串行口接收\/发送数据缓冲器都用SBUF,如果同时接收\/发送数据时,是否会...
串口通信中,有两个缓冲寄存器SBUF,一个是发送寄存器,一个是接收寄存器,这两个寄存器在物理结构上是完全独立的。它们都是字节寻址的寄存器,字节地址均为99H。这个重叠的地址靠读\/写指令区分:串行发送时,CPU向SBUF写入数据,此时99H表示发送SBUF;串行接收时,CPU从SBUF读出数据,此时99H表示接收SBUF...
关于51单片机SBUF的理解
SBUF实际上是两个部分组成的,一个是这能读的接收字节,一个直只能写的发射字节,由于一个只能读一个只能写,所以在串口通信时使用的是同一个地址。串口通信接收时当接收到一个完整字节时会产生一个接收中断标志,即RI自动硬件置1,此时可以读出该字节,读出之后存放的位置是有程序设计人员自己决定的,...
SBUF寄存器的发送与接收问题。
51的SBUF的收和发是两个寄存器,只不过用了同一个地址,理论上是可以同时收发的 收数据直接读取SBUF寄存器即可 TI和RI是硬件置位
51单片机串行通信缓冲器SBUF占用“同一”地址99H怎么理解?
SBUF是接收和发送两个8位寄存器,物理上是独立的,但共用一个地址99H。只所以不会冲突,是因为它们分别受“写SBUF”和“读SBUF”两个信号控制,这两个信号源自CPU的“写”和“读”,此二者是“非”的关系。当“写SBUF”有效时,“读SBUF”必无效。有效信号所接的SBUF被与系统总线连通,同时无效...