7050|28

63

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

串口传送数据传了3个字节,只显示一个字节 [复制链接]

uchar buffer[]={0xaa,0xbb,0x64};

void init_serial();  //串品初始化
void senddata(uchar *buffer,uchar length);//发送数据

void senddata(uchar *buffer,uchar length)
{
  uchar i;
  for(i=0;i   {
     SBUF=buffer;
     while (TI==1);
      TI=0;
   
  }  
  

}

//初始化串口
void init_serial()
{

  SCON=0x50;    //串口方式1
  ES=1;        //开串口中断
  PCON=0x80;   //波特率倍增  19.2k
  TMOD=0x20;
  TH1=0xfd;    //初值
  //TL1=0xfd;
  TR1=1;
  EA=1;



}



void senddata(uchar *buffer,uchar length)
{
  uchar i;
  for(i=0;i   {
     SBUF=buffer;
     while (TI==1);
      TI=0;
   
  }  
  

}

void main()
{
  uchar key;
  ledk=0;
  key=0;
  displaybufpoint=0;
  init_serial();
  senddata(buffer,3);
  while(1);
}


buffer[]={0xaa,0xbb,0x64};中有三个数据
但串品调试助手只显示一个64
不知是什么回事!

最新回复

我没有用中断的,一直for循环发送,起初也会数据丢失 后来加了小延时~~就ok了,  详情 回复 发表于 2010-5-13 11:31
点赞 关注

回复
举报

67

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
置hex显示方式
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
我是以十六进制显示的
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
ES=1; //开串口中断,为什么?
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

5
 
ES开不开没关系呀
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

6
 
既然用到串口通信就需要开串口中断
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

7
 
开了中断又没有服务程序,你不怕程序飞了?
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

8
 
我只是发送,没有接收
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

9
 
很可能是TI这个变量没有控制好。你是在定时器中断中对TI进行控制的吧?检查一下,TI=0赋值间隔有没有控制好,定时器没有起作用。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

10
 
没能,我没有在定时器中断中控制
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

11
 
1.你的那个senddata函数定义为什么写两遍啊。
2.你那个接收函数定义有问题,有这么一句while(TI==1),应该是while(TI==0)才对,意思是当TI==0的时候等待,也就是第一个数据发送还没有结束,当TI==1时跳出while循环,并执行TI=0,清零。这样你才能够进行第二个数据的发送。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

12
 
它好像只能接收一个
如果发两个,也只是显示最后一个
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

13
 
我也程序发送的,
TI=0说明还没发送完成
TI=1说明发关完成,然后TI=0再循环发第二个数据~
这个没错呀
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

14
 
我的意思是你在发送完毕TI被硬件置1之前,是需要等待的,也就是说要用一个while(TI==0);等待,当TI==1就直接跳出while了,然后你再次清零,进行第二个数据的发送。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

15
 
chutianya:好了,THANK YOU

chutianya,QQ:多少

我的:258041655

有空交流一下!!
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

16
 
没有中断函数怎么能行


我给你发个,你试试这个,我调试过的了可以。
#include

unsigned char buffer[3]={0xaa,0xbb,0x64};
unsigned char i;

//初始化串口
void init_serial()
{

  SCON=0x50; //串口方式1
  ES=1; //开串口中断
  PCON=0x80; //波特率倍增 19.2k
  TMOD=0x20;
  TH1=0xf6; //初值
  TL1=0xf6; //  此处不能注释掉
  TR1=1;
  EA=1;
}

void delay(unsigned int x)
  {
  while(x--);
  }

void main()
{
  init_serial();
        for(i=0;i<3;i++)
         {          
         SBUF=buffer;
         delay(30000);                  
         while (TI==1) {;}TI=0;
         }
    while(1) {;}
}

void intr(void) interrupt 4
  {
  if(TI==1)
   {
   TI=0;
   }
  }                  
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

17
 
对了,C51可不可以定义数据如:
UCHAR AA[];
不定长度的?
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

18
 
数组不可以不定义长度,这在标准C里面就是不允许的
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

19
 
你可以定义一个相对较大的数组,留有一定的余量。。。
令,15楼的说法有问题吧。。这里只是单片机发送数据,由pc接收,不需要用中断服务程序,有了反而画蛇添足,换句话说你的第一个数据发送完了,会进去中断服务程序,你那个里面有
if(TI==1)
      {
      TI=0;
      }
这样一来,你主程序里的
while   (TI==1)   {;}TI=0;
跟那个不是重复了么。或者说回到主程序的时候TI已经是等于0的了,你这个主程序了的while会一直等待,因为在这里根本就进行不下去了,while还在等待TI==1呢,可是中断服务程序已经给它清零了,根本这里就过不去,更不要说发送第二个数据了。
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

20
 
额。。。。上面对15楼的说法有点小问题,应该是这样的。重复下 ,呵呵。
15楼的说法有问题吧。。这里只是单片机发送数据,由pc接收,不需要用中断服务程序,有了反而画蛇添足,换句话说你的第一个数据发送完了,会进去中断服务程序,你那个里面有  
if(TI==1)  
  {  
  TI=0;  
  }  
这样一来,你主程序里的
while (TI==1) {;}TI=0;  
跟那个不是重复了么。或者说回到主程序的时候TI已经是等于0的了,while没有循环就执行TI=0,然而TI在中断中已经清零了。这里重复了。。。。。
还有:应该是pc接收端接收程序采用中断,当单片机没有发送数据的时候不予理会,当有数据发送到pc时,引起pc中断,并接收单片机发送来的数据。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表