打印

模拟串口接收数据错误

[复制链接]
3520|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qe123|  楼主 | 2010-9-7 13:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用模拟串口接收数据,波特率为1200,再接收数据的时候总是错误,如下是几种 情况,吧0x01接收成0x81,0x20接收成0xA0,0x12接收成0x10,0x01接收成0x03等,不知道是什么原因,每次接收63个数据,每次都是一个字节有问题,接收几十次会有一次,随机出现我没有找到规律,我用示波器观察过我在采集数据时每位采集的位置基本上都在每位的中间左右,但还是有错误,请大侠出出主意来怎么解决这个问题!
程序如下:
起始位下降沿中断开始接收数据
#pragma vector=PORT1_VECTOR
__interrupt void IPORT1(void)
{   
     if((!(RVAL_Hot&ReBIt_Hot))&&RECIFG_Hot)
     {
          IE2&=~BTIE;//tz100604 关基本时钟
          RECNIE_Hot;//关I/O中断
          RECCIFG_Hot;//清中断标志
          TA1CTL = 0;
          TA1CTL=TACLR+TASSEL0;//选择ACLK作时钟,TAR清零+ID0
          TA1CCR1=38;//设置CCR0值
          TA1CCTL1=CCIE;// 使能比较中断
          TA1CTL |= MC_2;//连续计数模式;
          rsdown=0xff;  
     }
     P1IFG &= 0;//中断标志清零
}

中断接收函数
#pragma vector=TIMER1_A1_VECTOR  
__interrupt void Timer1_sent(void)
{
    TA1CCTL1&=~CCIFG;///中断标志位清零
    if(rsdown==0xff)//接收
    {  
        TA1CCR1 += RBITTIME_Hot;//修改比较时间
        if(numbitdown==1)
        {
            RECCIFG_Hot;//清接收脚中断
            RECNIE_Hot;//禁止中断
        }
        if(numbitdown<9)//接收一个字节
        {
            bytebufdown>>=1;
            if(RVAL_Hot&ReBIt_Hot)
            {
                bytebufdown|=BIT7;
            }  
            else
                bytebufdown&=0x7f;
        }
        numbitdown++;  
                  
       if(numbitdown>10)
       {
           stop_timerA5();//停止定时器
           recedata[jj++] = bytebufdown;//保存接收数据
           if((cmode&cmd3) == 0) //接收一帧后结束接收等待处理完后再接收
           {   
                 RECCIFG_Hot;//清中断标志
                 RECIE_Hot;//使能中断
           }
           numbitdown=1;
       }
   }
}

相关帖子

沙发
qe123|  楼主 | 2010-9-7 13:14 | 只看该作者
匠人大人也请过来指教一下,正好您在线

使用特权

评论回复
板凳
chen3bing| | 2010-9-7 15:45 | 只看该作者
你用的什么单片机?

使用特权

评论回复
地板
qe123|  楼主 | 2010-9-7 22:57 | 只看该作者
3# chen3bing
用的是430 的F417

使用特权

评论回复
5
qe123|  楼主 | 2010-9-8 13:04 | 只看该作者
好像人很少了,帖子放了些时日都没人理

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:天行健,君子以自强不息!

82

主题

623

帖子

3

粉丝