用模拟串口接收数据,波特率为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;
}
}
} |