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;
}
}
那位大神知道这是怎么回事吗?
看一下IDLE(休闲寄存器)的值,有没有改变? 那个位在异步收发条件下也起作用? vilsenma 发表于 2018-7-20 19:41
看一下IDLE(休闲寄存器)的值,有没有改变?
m=m+1通过在中断中禁止uart1的接收使能 UART1->CR2 &= ~0x20;//禁止接收中断可以解决,能够正确的收发一帧数据,但是在数据处理完后 UART1->CR2 |= 0x20 接收使能位也不置1,而且进不了接收中断函数,你清楚这是为什么吗? 接收完一帧数据IDLE=1
页:
[1]