串口通信 关于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是一直存在的。???????谢谢。请指教。 展开
但是有问题出现了。
这个是发送代码;每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是一直存在的。???????谢谢。请指教。 展开
3个回答
展开全部
1、你发送端延迟是100毫秒发一次
2、你接收端的延迟是150毫秒
3、发送和接收延迟本身就矛盾,接收到的肯定会有丢失
4、你发送端,发送的是P1口的状态
5、在接收端接收的时候,就不要加延迟了
2、你接收端的延迟是150毫秒
3、发送和接收延迟本身就矛盾,接收到的肯定会有丢失
4、你发送端,发送的是P1口的状态
5、在接收端接收的时候,就不要加延迟了
更多追问追答
追问
我就是想知道延迟了会出现什么问题;我故意设置150ms,我是认为会发生信息丢失。但是感觉没有丢失呀。你看那个gif图是接收端还是流水灯。要是信息丢失的话,应该会出现某个灯不会亮的,所以我怀疑像我这个图分析的那样;你看我的第二个图片。。。我觉得我这个分析比较符合现象,但是为什么不丢失呢?
追答
应该说是数据阻塞,串口还是接收到数据了,但是每个数据是在每延迟150毫秒后再执行的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
接收端的主程序很简单了,串口设置成中断方式,接收子程序改成中断子程序,每收到一个字节就送到P1口就行了。而主程序也不用延时,就是循环等待中断,没有什么可作的事。在初始化时要开中断:
IE=0x90;
主程序变成:
void main()
{
sbufint();
while(1); //在这里循环等待中断
}
而接收中断子程序为:
void uart() interrupt 4
{
RI=0;
P1=SUBF;
}
这样,接收端就与发送端同步了.
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 这个图片是我个人认为的,但是不知道为什么还是流水灯。一直都是;;
追答
这样做是不靠谱的,因为用查询方式,发送端和接收端不能同步,因此,利用两者不同的延时来想跳位不好实现,这样做有什么目的吗?
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询