你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM8S 的多帧收发问题

[复制链接]
annQian 提问时间:2018-7-20 17:49 /
INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
{
   uint8_t receData = 0;
    if(ComuData.Chan==0)
        {
      receData = (uint8_t)UART1->DR;
   ComuData.Data[ComuData.Len++]=  receData;
//   if(ComuData.Count >= 6)
//   {
//       ComuData.Count = 0;
//    ComuData.Len = 6;
//   }      
           
        }

}//异常地址的位置

void cmd_Handle(void)
{  
  uint8_t m=0;
//  uint8_t data[6]={0x01,0x10,0x11,0x02,0x8D,0x8C};
//  Crc_Vrfy_String_TE(data, 6);
     if(ComuData.Len == 6 && 0x01 == Crc_Vrfy_String_TE(&ComuData.Data[0],ComuData.Len) )
  {
     ComuData.Chan =1;  //程序可以正常的接收字符,并符合CRC16效验
  }
           
  else
         ComuData.Chan =0;  
  if(ComuData.Chan == 1)
        {
    GPIOD->ODR |= GPIO_PIN_7;//transmit
            for(m=0;m< 6;)
            {
               
       UART1->SR &=0xBF;//clear TC bit
    while((UART1->SR &0x80)!= 0x80);//wait data sent to 移位寄存器里  
                UART1->DR = ComuData.Data[m];
    m = m+1;//程序走到这里就中断了 m++;指令也不行,把m++写到for循环里面也不行,停止时就跑到接收中断函数结束处
    while ((UART1->SR & 0x40)!=0x40);//等待移位寄存器中的数据发送发成
   
                //Sys_Delay(1);              
                  
            }
     ComuData.Chan=2;
  }
  
}

那位大神知道这是怎么回事吗?
收藏 评论3 发布时间:2018-7-20 17:49

举报

3个回答
vilsenma 回答时间:2018-7-20 19:41:09
看一下IDLE(休闲寄存器)的值,有没有改变?

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

annQian 回答时间:2018-7-22 15:46:10
那个位在异步收发条件下也起作用?
annQian 回答时间:2018-7-23 10:35:36
vilsenma 发表于 2018-7-20 19:41
看一下IDLE(休闲寄存器)的值,有没有改变?

m=m+1  通过在中断中禁止uart1的接收使能 UART1->CR2 &= ~0x20;//禁止接收中断  可以解决,能够正确的收发一帧数据,但是在数据处理完后 UART1->CR2 |= 0x20 接收使能位也不置1,而且进不了接收中断函数,你清楚这是为什么吗? 接收完一帧数据IDLE=1
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版