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

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

[复制链接]
hqw 提问时间:2020-6-29 09:46 /
请教下各位,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 */





USART1.zip

下载

5.96 KB, 下载次数: 0, 下载积分: ST金币 -1

收藏 评论3 发布时间:2020-6-29 09:46

举报

3个回答
陌路夕颜 回答时间:2020-6-29 21:15:16
参考一下官方的例程看看吧
butterflyspring 回答时间:2020-7-9 16:45:57
对,调试一下官方的例程,熟悉一下接收和发送函数。所有函数都有一定逻辑和条件的,并不是任何时候都能适用的。熟悉后就知道怎么用了
巡山小妖 回答时间:2020-7-10 10:44:46
HAL_UART_Transmit这个发送是阻塞式发送 只要发送没有发送完 程序就一直再这里 期间不会进接收中断

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版