4320|17

55

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

89C2051串口接收问题 [复制链接]

void init_serial(void)   
{
   SCON = 0x50;
   PS=1;
   TMOD |= 0x20;
   PCON |= 0x80;
   TH1=0xfa;
   TL1=0xfa;
   IE|= 0x98;//允许串行中断
   TR1 = 1;//启动定时器1
}

void serial(void) interrupt 4
{
    if (RI)
    {
     if(SBUF=='@')
     {
       RI =0;
       while(RI==0);
       RI=0;
       inbuf =SBUF;
       while(RI==0);
       RI=0;
       if(SBUF!='#')
      inbuf =77; // 调试用
  }
}
}

怎么在主程序里愣是接收不到inbuf里面的接收值呢,‘@,#’是自定义起止码,C51发送过来的当然也是这个协议。第一次用2051,实在想不明白了,高手指点。

最新回复

你写的程序本身就很有问题。 异步串口硬件问题里面一个比较容易出现的就是收发两端的频率误差。因为2051内置的振荡器不稳,如果使用专用的晶振做时钟源,比如1.8432,7.3842,11.0592等,就不会有这个问题。 然后再强调一下,你写的程序很有问题。^_^  详情 回复 发表于 2009-12-9 11:48
点赞 关注

回复
举报

83

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
  主机发送 "@ + char + # " ,急用,谢谢。
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
  大家难道都忘记了吗?
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

4
 
这种处理策略是有问题的。
串口是基于字符串传送的,每接收一个字符就会中断一次。
lz的程序中断还没结束就想接收到下一个字符,这样行不通的。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

5
 
   if (RI)
这句去掉
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用楼主 hallowwar 的回复:
void serial(void) interrupt 4
{
? ? if (RI)
? ? {
? ? if(SBUF=='@')
? ? {
? ? ? RI =0;
? ? ? while(RI==0);
? ? ? RI=0;
? ? ? inbuf =SBUF;
? ? ? while(RI==0);
? ? ? RI=0;
? ? ? if(SBUF!='#')
? ? ? inbuf =77; // 调试用
? }
}
}

怎么在主程序里愣是接收不到inbuf里面的接收值呢,‘@,#’是自定义起止码,C51发送过来的当然也是这个协议。第一次用2051,实在想不明白了,高手指点。

你这是在串口中断中查询,算法有问题.如果查询建议直接在主程序中;如果中断,就不要在中断程序中"while(RI==0);"这样查询,浪费资源.你可以建一个接收缓冲区来存接收报文.
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 3 楼 zyzhang365 的回复:
这种处理策略是有问题的。
串口是基于字符串传送的,每接收一个字符就会中断一次。
lz的程序中断还没结束就想接收到下一个字符,这样行不通的。


  在C51中是调试通过的啊,这就是中断+查询的综合体吧。请问东狮山,即使浪费了资源也不至于不能使得主程序不能读inbuf里面的值吧。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

8
 
可能是串口没有接收到数据,硬件或软件初始化问题,可以先用查询方法确定串口收发数据都正常,再继续下一步。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

9
 
     

void serial(void) interrupt 4
{
        RI =0;
        buf[buf_count++] =SBUF;       
}

  void main()
{
       if(buf[0] =='@' && buf[2] =='#')
           {
                low =7*(buf[1]%10);
                        high =7*(buf[1]/10);
                        buf_count =0;
                    memset(buf,'\0',sizeof(buf));
            }

  .....................

}

  受楼上几位大侠启发,我改成以上的代码,为了节约资源,但是还是没有收到数据,真的是烦死人了。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 7 楼 garyliu1104 的回复:
可能是串口没有接收到数据,硬件或软件初始化问题,可以先用查询方法确定串口收发数据都正常,再继续下一步。


  我用示波器看了的,RX脚是有波形的啊。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

11
 
   还有帮忙的没?
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(中级)

12
 
你的主机用的是PC吧
用的是串口调试助手吗?
发的字符的格式有问题
写成“@c#”发送,保管可以(c是你要发送的字符)
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

13
 
楼上其实有人说的很清楚了,首先串口是基于字符串传送的,每接收一个字符就会中断一次,(当然有些单片机是可以设置很多个字节才触发中断)。其次你自己应该建一个接收缓冲区来存接收报文。如果接受到‘@’字符则存入缓冲区第一个位置,然后依次存入。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 12 楼 heyme 的回复:
楼上其实有人说的很清楚了,首先串口是基于字符串传送的,每接收一个字符就会中断一次,(当然有些单片机是可以设置很多个字节才触发中断)。其次你自己应该建一个接收缓冲区来存接收报文。如果接受到‘@’字符则存入缓冲区第一个位置,然后依次存入。


  接受缓冲区就是这么设置的吧:
void serial(void) interrupt 4
{
RI =0;
buf[buf_count++] =SBUF;
}

我刚才试了一把,彻底的不明白了,我只发送了一个字符,那么中断也就只有一次了,可是2051还是没有接收到数据,哎,怎么办啊,现在一个中断收不到,这单片机怎么这样的呢?
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 7 楼 garyliu1104 的回复:
可能是串口没有接收到数据,硬件或软件初始化问题,可以先用查询方法确定串口收发数据都正常,再继续下一步。

  所谓的查询就是在循环里面判断: if(RI) {}  ???
  是不是先RI==1;再引起中断的呢?
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

16
 
你的总中断EA开了没?
再查查
先不要实现功能,先看看能不能收到字符
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

17
 
  谢谢各位,发送的数据经过几次周折吧,到了2051这边可能就识别不了了。后来换了一个发射终于可以接收数据了,但是现在还是停留于
void serial(void) interrupt 4
{
RI =0;
buf =SBUF;
}
单个阶段,以后再慢慢说了。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

18
 
你写的程序本身就很有问题。

异步串口硬件问题里面一个比较容易出现的就是收发两端的频率误差。因为2051内置的振荡器不稳,如果使用专用的晶振做时钟源,比如1.8432,7.3842,11.0592等,就不会有这个问题。

然后再强调一下,你写的程序很有问题。^_^
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表