串口通信 关于sbuf的问题。

今天试了一下串口通信、两个单片机。一个是发送端。产生流水灯。一个是接收端。接受发送端的流水灯信息、然后同步、但是有问题出现了。这个是发送代码;每100ms移动一次、同时发... 今天试了一下串口通信、两个单片机。一个是发送端。产生流水灯。一个是接收端。接受发送端的流水灯信息、然后同步、

但是有问题出现了。
这个是发送代码;每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是一直存在的。???????谢谢。请指教。
展开
 我来答
redlover68
2013-08-10 · TA获得超过154个赞
知道小有建树答主
回答量:125
采纳率:0%
帮助的人:56.6万
展开全部
1、SBUF 是两个寄存器,名字虽然一样,发送的只能写,接受的只能读。
2、SBUF收到数据会产生接收中断,接收中断产生后无法再接收其他数据,知道读取SBUF后将接收中断清零,因此
recdat=SBUF;
while(RI==0);
应该交换次序。
3、未产生接收中断时,SBUF值并不固定,串口数据串行传入也是一位一位的改变的,可能读取到非法值。
cjj796
2013-08-03 · TA获得超过8702个赞
知道大有可为答主
回答量:1.3万
采纳率:68%
帮助的人:3378万
展开全部
1、你发送端延迟是100毫秒发一次
2、你接收端的延迟是150毫秒
3、发送和接收延迟本身就矛盾,接收到的肯定会有丢失
4、你发送端,发送的是P1口的状态
5、在接收端接收的时候,就不要加延迟了
更多追问追答
追问
我就是想知道延迟了会出现什么问题;我故意设置150ms,我是认为会发生信息丢失。但是感觉没有丢失呀。你看那个gif图是接收端还是流水灯。要是信息丢失的话,应该会出现某个灯不会亮的,所以我怀疑像我这个图分析的那样;你看我的第二个图片。。。我觉得我这个分析比较符合现象,但是为什么不丢失呢?
追答
应该说是数据阻塞,串口还是接收到数据了,但是每个数据是在每延迟150毫秒后再执行的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lycdl
高粉答主

2013-08-03 · 醉心答题,欢迎关注
知道大有可为答主
回答量:2万
采纳率:94%
帮助的人:4779万
展开全部
接收端的主程序很简单了,串口设置成中断方式,接收子程序改成中断子程序,每收到一个字节就送到P1口就行了。而主程序也不用延时,就是循环等待中断,没有什么可作的事。在初始化时要开中断:
IE=0x90;
主程序变成:
void main()
{
sbufint();

while(1); //在这里循环等待中断
}
而接收中断子程序为:
void uart() interrupt 4
{
RI=0;
P1=SUBF;
}
这样,接收端就与发送端同步了.
更多追问追答
追问
我是故意设置为150ms的。我就是想知道不会不会出现跳位;我那个图片我分析过。我觉得会出现调位,但是现象就是不出现。。。。http://g.hiphotos.baidu.com/zhidao/pic/item/d50735fae6cd7b898859c27c0e2442a7d9330e13.jpg 这个图片是我个人认为的,但是不知道为什么还是流水灯。一直都是;;
追答
这样做是不靠谱的,因为用查询方式,发送端和接收端不能同步,因此,利用两者不同的延时来想跳位不好实现,这样做有什么目的吗?
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式