hqw 发表于 2020-6-29 09:46:35

usart1能原先RX正常,但只要运行TX后,就RX无法进入

请教下各位,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;
   // unsigned intcrc;
//unsigned char crch, crcl;
    if (cmdArrived) //有命令到达时,读取处理该命令
    {
      cmdArrived = 0;

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

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

                                                                                }       
            }
             if ((buf == 0X10)&&(buf == 0X00))BigCNT_total =buf;
                                                        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;
       
          TXbuf=0X5A;TXbuf=0XA5;
          TXbuf=0X05;
          TXbuf=0X82;
          TXbuf=0X10;TXbuf=addr;
          TXbuf=0X00;TXbuf=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 = 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 */





陌路夕颜 发表于 2020-6-29 21:15:16

参考一下官方的例程看看吧

butterflyspring 发表于 2020-7-9 16:45:57

对,调试一下官方的例程,熟悉一下接收和发送函数。所有函数都有一定逻辑和条件的,并不是任何时候都能适用的。熟悉后就知道怎么用了:)

klhsdyy 发表于 2020-7-10 10:44:46

HAL_UART_Transmit这个发送是阻塞式发送 只要发送没有发送完 程序就一直再这里 期间不会进接收中断
页: [1]
查看完整版本: usart1能原先RX正常,但只要运行TX后,就RX无法进入