annqian 发表于 2018-7-20 17:49:05

STM8S 的多帧收发问题

INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
{
   uint8_t receData = 0;
    if(ComuData.Chan==0)
      {
      receData = (uint8_t)UART1->DR;
   ComuData.Data=receData;
//   if(ComuData.Count >= 6)
//   {
//       ComuData.Count = 0;
//    ComuData.Len = 6;
//   }      
         
      }

}//异常地址的位置

void cmd_Handle(void)
{
uint8_t m=0;
//uint8_t data={0x01,0x10,0x11,0x02,0x8D,0x8C};
//Crc_Vrfy_String_TE(data, 6);
   if(ComuData.Len == 6 && 0x01 == Crc_Vrfy_String_TE(&ComuData.Data,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+1;//程序走到这里就中断了 m++;指令也不行,把m++写到for循环里面也不行,停止时就跑到接收中断函数结束处
    while ((UART1->SR & 0x40)!=0x40);//等待移位寄存器中的数据发送发成
   
                //Sys_Delay(1);            
                  
            }
   ComuData.Chan=2;
}

}

那位大神知道这是怎么回事吗?

vilsenma 发表于 2018-7-20 19:41:09

看一下IDLE(休闲寄存器)的值,有没有改变?

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
页: [1]
查看完整版本: STM8S 的多帧收发问题