串口通信为何出错?

[复制链接]
2523|7
 楼主| ningling_21 发表于 2012-2-29 23:55 | 显示全部楼层 |阅读模式
本帖最后由 ningling_21 于 2012-3-1 15:50 编辑

代码如下:
while(1)
{
if(flag_rece_end==1)      //接收一帧完成?
  {
   
   
   flag_rece_end=0;  
        
    Time[0]=rece_buff[7];//假设数据都合法
                                    //年月,星期,日,时分秒
    Time[1]=rece_buff[6];
    Time[2]=rece_buff[5];
    Time[3]=rece_buff[4];;//日期
    Time[4]=rece_buff[3];;//星期
    Time[5]=rece_buff[2];;
    Time[6]=rece_buff[1];
  
    I2C_Puts(0xa2,0x02,7,Time);//更新RTC时间
      
   
   
  }
}
/////////////////////////////////////////////////////////////////////////////////////////////
void Init_uart(void) interrupt 4
{
EA=0;
if(RI==1)
{
  rece_buff[rece_cnt]=SBUF;
  rece_cnt++;                         //接收个数加1
  if(rece_cnt==(rece_buff[0]))  //接收完成?
  {
     flag_rece_end=1;    //接收一帧完成标志
  }
  else
  {
    flag_uart=1;
  }
  RI=0;
  LED1=~LED1;  
}
else if(TI==1)
{
     TI=0;
  flag_send=0;    //发送完成
}

EA=1;
}

MCU=STC89C58;
问题:上位机发送数据串:如:08 01 02 03 04 05 06 07(第一字节代表数据串长度)
单片机总收不完一帧,导致MCU系统上时间无法更新...
杨立业yly 发表于 2012-3-3 11:24 | 显示全部楼层
你把EA=0;h和EA=1;去了试一下。我是这样理解的,收完第一个字节进入中断后你把总中断关了,下边的数据就收不到了 ,同样你也发送不出去。不知道我说的对不对,请大家拍砖。
 楼主| ningling_21 发表于 2012-3-3 12:55 | 显示全部楼层
你把EA=0;h和EA=1;去了试一下。我是这样理解的,收完第一个字节进入中断后你把总中断关了,下边的数据就收不到了 ,同样你也发送不出去。不知道我说的对不对,请大家拍砖。 ...
杨立业yly 发表于 2012-3-3 11:24


退出中断时已经开中断,以后的数据怎么会发不出去?
ghpzhu 发表于 2012-3-3 13:19 | 显示全部楼层
EA = 0期间,串口通讯发送过来的bits就接受不到了...
 楼主| ningling_21 发表于 2012-3-3 15:34 | 显示全部楼层
EA = 0期间,串口通讯发送过来的bits就接受不到了...
ghpzhu 发表于 2012-3-3 13:19


EA=0;是在收到数据之后,且应该不影响下一个字节的接收,因为中断里的时间不长,波特率9600足够处理的完...
yesful 发表于 2012-3-3 20:43 | 显示全部楼层
rece_cnt是全局变量?及时清零了没有?
杨立业yly 发表于 2012-3-3 21:59 | 显示全部楼层
5# ningling_21
9600bps是数据的传输速率,不是处理速度吧?
 楼主| ningling_21 发表于 2012-3-4 08:40 | 显示全部楼层
5# ningling_21  
9600bps是数据的传输速率,不是处理速度吧?
杨立业yly 发表于 2012-3-3 21:59


在9600波特率,接收一个字节需1毫秒左右时间,这么长时间还处理不完保存一字节数据吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5015

主题

17845

帖子

51

粉丝
快速回复 在线客服 返回列表 返回顶部