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

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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版