5763|16

82

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教:串口接收不对?? [复制链接]

各位大侠,我用51单片机的串口接收数据
在开始的几秒内接收是正确的,可是过一会就接收不正确了,为甚呢??
串口以9600的波特率一直在接收数据,是不是接收时间长波特率就乱了?
void serial() interrupt 4 using 1   
{
           RI=0;
         if(SBUF==0x40)
            a++;
         if((a==2)&&(SBUF==0x48))
            b++;        
         if((b==1)&&(SBUF==0x61))
           flag++;
       
          if(flag==1)
          {
           if(igps==53) //此时为跟踪到的卫星数
           {
            a=SBUF;

              if(a>2) //如果接收到的卫星数>2颗,同步灯亮
                 P1_3=1;
                else
                  P1_3=0;

                 a=0;
                 b=0;
                 flag=0;
                 igps=0;
                }
           else
            igps++;
          }

}
程序注释:串口收到@@Ha后,对收到的第53个字符进行判断,如果大于2就将P1.3制高,小于2就制低,然后重新判断是否接收@@Ha

最新回复

问题解决了! 我用串口只接收数据不做判断;在一个外部中断里对收到的数据进行判断处理,就可以了! 不过仍然不太肯定是不是串口9600的波特率太低了,所以会产生冲突? 谢谢各位大虾的帮助@!  详情 回复 发表于 2008-6-24 09:40
点赞 关注

回复
举报

67

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
波特率没有认为改变一般不会变的,51的波特率是不是要占用一个定时器的? 如果有的话在串口通信的时候不要把定时器给用了。
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你应该开一个内存,中断 只是把数据推入缓冲里,主外程序不断处理缓冲里的 数据,
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

4
 
从程序上看不出会出错的可能。

接收不正确是怎么个不正确法?全部乱码了?

有没有试过用PC向该串口持续发16进制数据?以此来判断程序的健壮性?
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

5
 
请问如何开一个内存?
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

6
 
接收不正确是指:过一会后,我用串口调试助手收到了我需要的数据头@@Ha,可是我的程序去没有反映
我把接收到的第53个数据送数码管显示,开始是对的,过一会就不能根据串口收到的数据进行变化
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

7
 
感觉程序上没有问题,是不是方法不对?各位老大帮帮忙啊!
弄了很久了都没弄好,急!
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

8
 
void WrRiBuf(unsigned char c)
{
  --放入一个数据中,注意操作如堆栈
}
void IntComm() interrupt 4
{
  if(RI)
  {
    RI = 0;
    WrRiBuf(SBUF);
  }
}   

void main(void)
{

   处理
}
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

9
 
谢谢,我试试看
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

10
 
happyflystone给的是防止溢出的操作方法。

9600的串口,1位开始位,8位数据位,1位停止位,一共10位,1.04mS就会有一个字节。

lz仔细看一下:你用的晶振是多少的?51单片机的指令周期是12个时钟周期,在你的中断程序里,从

  if(SBUF==0x40)
    a++;
开始,一直到最后
  else
    igps++;
一共有多少条指令,其中要判断跳转多少次,最坏情况大概需要多长时间。

另外还要考虑中断进出的现场保护和恢复。

如果这些的时间达到1.04mS的极限值,那么串口必然会丢数据。如果系统还做别的事情,比如LED的显示,那么时间上的要求会更苛刻一点。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

11
 
程序出问题的可能性大。。。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

12
 
我的整个系统是:当有外部中断时串口开始做如上所述的判断,用定时器做7个LED的动态扫描;
是不是单片机同时干的事太多了?
各位老大给点建议,串口中断程序该进行咋样的改进,能避免这种问题?
我试过将中断里的程序写成一个子函数放在中断函数外面,问题依然存在!
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

13
 
LZ用的是标准的兼容的51吗?

如果是8051里,不管是串口发完?还是收完一个字节,它都请求中断,如果允许了的话

一般来说,都在中断里用IF RI和IF TI对收发专门处理

另外:
串口没有反应的话,首先要做的是看配置和电路

先确定这两个,再于其上加协议吧.不然,这么调很吃力

呵呵
 
 
 

回复

103

帖子

0

TA的资源

一粒金砂(初级)

14
 
建议在串口中断里,将收到的数据放到一个buffer中,并将几个状态变量设置一下,然后立即结束中断。

在main()的while(1)中,根据串口中断设置的状态量,来处理这个buffer。比如读取第一个,判断是不是@, 如果不是,就将这个状态量清0,如果是,就等下一个,判断是不是@。如果前三个通过,就直等到接收数目到了53,才判断是不是>2。

就这样做。主要工作是要设置好这些状态量,也就是必须建立好整个接收流程的状态机,什么时候要置什么状态标志位,对应要做什么处理。还有buffer有读取有清空,怎么保证不会误读误删。

这个做好了,以后你的串口工作再也不用担心会溢出或者丢数据的。

还有,建议做这个的时候,将单片机别的所有工作都停掉,先解决串口问题。
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

15
 
***************************************************************************

思想决定行动,行动决定习惯,习惯决定命运.
程序员在深圳QQ群,交流产生思想碰撞.

部份专业群:
程序员在深圳c++群15195967
程序员在深圳英语学习群:23864353
程序员在深圳c++Ⅱ17409451
程序员在深圳嵌入式开发群37489763
程序员在深圳移动开发群31501597
程序员在深圳创业群33653422

部份高级程序员群:
高级群I:17538442
高级群II:7120862

部份初、中级程序员群:
第三群:2650485
第五群:29537639
第四群:28702746
第六群:10590618
第七群:10543585
第八群:12006492
第九群:19063074
第十群:2883885
第十一群:25460595
第十二群:9663807

深圳程序员QQ群联盟成立三年多,拥有三十个以上的QQ群,人数超二千多人,大量经验丰富的老手,成员从业于大公司(如微软、IBM,SUN,华为

)、来自国内著名高校和研究院成员,和有丰富实践经验的高级程序员、系统分析员(包括参加过上亿元的项目的架构师),有很热爱技术的成员

(包括自己写操作系统),还有少数女程序员。推荐:深程高级群I:17538442 深程高级群II:7120862 (深程高级群不欢迎新手,如果在深圳,月薪

6K以下的别加入) c++:15195967  mobile:31501597嵌入式:37489763  
——————————————————————————————————————————
如果你不是第一次看到此广告,说明我们最近T了一些人,因为我们要不断提升群的质量,保证名副其实.
-------------------------------------------------------------------------------------
在通过电邮、新闻组或者聊天室提出技术问题前,检查你有没有做到:
      1. 通读手册,试着自己找答案。
      2. 在FAQ里找答案(一份维护得好的FAQ可以包罗万象:)。
      3. 在网上搜索(个人推荐google~)。
      4. 向你身边精于此道的朋友打听。
我想我们首先应该靠自己解决问题,然后才是问!

*****************************************************************************
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

16
 
哈哈哈,是 GPS吗?

我也马上要搞了,

支持一下
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

17
 
问题解决了!
我用串口只接收数据不做判断;在一个外部中断里对收到的数据进行判断处理,就可以了!
不过仍然不太肯定是不是串口9600的波特率太低了,所以会产生冲突?
谢谢各位大虾的帮助@!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

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