STM32
直播中

廖阿朋

9年用户 1369经验值
私信 关注
[问答]

USART1运行TX函数,接下来就无法再接收了的原因?

请教下各位,USART1如果不运行TX函数,每次接收都正常,但在接收一次,如果运行TX函数,接下来就无法再接收了

/*******************************************************************************
* 函数名  : UartRxMonitor
* 描述    : //串口接收监控函数//判断是否接收完了一帧数据
* 输入    : 无
* 返回    : 无
* 说明    :
*******************************************************************************/  
void UartRxMonitor(unsigned char ms)  //串口接收监控函数//判断是否接收完了一帧数据
{
    static unsigned char cntbkp = 0;
    static unsigned char idletmr = 0;
    if (cntRxd > 0)  //接收计数器大于零时,监控总线空闲时间
    {
        if (cntbkp != cntRxd)  //接收计数器改变,即刚接收到数据时,清零空闲计时
        {
            cntbkp = cntRxd;
            idletmr = 0;
        }
        else
        {
            if (idletmr < ms)  //接收计数器未改变,即总线空闲时,累积空闲时间
            {
                idletmr ++;
                if (idletmr >= ms)  //空闲时间超过4个字节传输时间即认为一帧命令接收完毕
                {
                     cmdArrived = 1; //设置命令到达标志
                }
            }
        }
    }
    else
    {
        cntbkp = 0;
    }
}

*******************************************************************************/  
void TouchScreen_SubLoop(void ) //串口驱动函数,检测接收到的命令并执行相应动作
{
   unsigned char len;
    unsigned char buf[40];
   // unsigned int  crc;
  //  unsigned char crch, crcl;
    if (cmdArrived) //有命令到达时,读取处理该命令
    {
        cmdArrived = 0;

        len = UartRead(buf, sizeof(buf)); //将接收到的命令读取到缓冲区中
                        
                                            // HAL_UART_Transmit( huart2, buf, len, 10);                  
        if ((buf[0] == 0X5A)  (buf[1] == 0XA5))  //核对帧头决定是否响应命令
        {
               if ((buf[4] == 0X10)  (buf[5] == 0X10))  //核对地址以决定是否响应命令
              {
                    if(buf[8] == 0X01) //起动电机
                    {
                        MotorStart=1;

                                                                                }
                                                                                if(buf[8] == 0X00) //起动电机
                    {
                        MotorStart=0;

                                                                                }        
              }
             if ((buf[4] == 0X10)  (buf[5] == 0X00))  BigCNT_total =buf[8];
                                                        BigCNT_in=BigCNT_total;
                                                        BigCNT_out=0;
                                                        TXtoScreen(BigCNT_inAddr,BigCNT_in);//不屏蔽的话,这个在接收一次后,下次就无法接收
                                                        TXtoScreen(BigCNT_outAddr,BigCNT_out);//
        }
    }
}

void TXtoScreen(unsigned char addr,unsigned char data)
{
          unsigned char TXbuf[40];
        
          TXbuf[0]=0X5A;TXbuf[1]=0XA5;
          TXbuf[2]=0X05;
          TXbuf[3]=0X82;
          TXbuf[4]=0X10;TXbuf[5]=addr;
          TXbuf[6]=0X00;TXbuf[7]=data;
        
         HAL_UART_Transmit( huart1, TXbuf, 8, 100);   
         
}

RX接收用中断,TX没用到中断,直接用HAL_UART_Transmit( huart1, TXbuf, 8, 10);  会不会问题的根源在这?
void HAL_UART_RxCpltCallback(UART_HandleTypeDef*huart)
{
                          UNUSED(huart);
               if(huart== huart1)
               {
                     //不定长接收
                                                                  if (cntRxd < sizeof(bufRxd)) //接收缓冲区尚未用完时,
                                          {
                                                                       bufRxd[cntRxd++] = RXBuf_OneData; //保存接收字节,并递增计数器
                                                }
                                                         }            
}

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */

  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler( huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
   
  /* USER CODE END USART1_IRQn 1 */
}

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */






回帖(1)

李恬恬

2024-4-12 14:46:48
HAL_UART_Transmit这个发送是阻塞式发送 只要发送没有发送完 程序就一直再这里 期间不会进接收中断
举报

更多回帖

发帖
×
20
完善资料,
赚取积分