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

stm32fo72用IDLE接收不定长数据

[复制链接]
xp3 提问时间:2018-3-8 09:39 /
阅读主题, 点击返回1楼
收藏 评论13 发布时间:2018-3-8 09:39
13个回答
xp3 回答时间:2018-3-8 12:51:49

点评

楼主乖,不哭  发表于 2018-3-8 18:00
dsjsjf 回答时间:2018-3-15 15:56:34
给你一个参考,一个空闲中断,一个事件型任务
/* USART6 串口空闲中断函数 */
void HeaterComm_Callback(void)
{
  uint32_t TmpFlag = 0;
  uint32_t TmpLength;
  
  TmpFlag = __HAL_UART_GET_FLAG(&huart6, UART_FLAG_IDLE);      
  if((TmpFlag != RESET))
  {
    __HAL_UART_CLEAR_IDLEFLAG(&huart6);  
    //HAL_UART_AbortReceive_IT(&huart6);                             
    HAL_UART_DMAStop(&huart6);      
    TmpLength = __HAL_DMA_GET_COUNTER((DMA_HandleTypeDef *)&hdma_usart6_rx);         
    //TmpLength = hdma_usart6_rx.Instance->NDTR;
    HeaterComm.DataLength = 32 - TmpLength;
    osSignalSet (HeaterComm_TaskHandle, 1);                     //HeaterComm.ReceiveFlag = 1;
  }
}

/* HeaterCommTask function */
void HeaterCommTask(void const * argument)
{
  /* USER CODE BEGIN HeaterCommTask */
  osEvent Event;
  
  HeaterComm.CommStatus = 1;
  HeadData.Sensor.TcTemp[0].Status = Normal;
  HeadData.Sensor.TcTemp[1].Status = Normal;
  HeadData.Sensor.TcTemp[2].Status = Normal;
  HeadData.Sensor.TcTemp[0].Value = 25;
  HeadData.Sensor.TcTemp[1].Value = 25;
  HeadData.Sensor.TcTemp[2].Value = 25;
  
  __HAL_UART_ENABLE_IT(&huart6, UART_IT_IDLE);
  HAL_UART_Receive_DMA(&huart6, Rs422RxData.Char, 32);
  /* Infinite loop */
  for(;;)
  {
    Event = osSignalWait(1, 2000);
    if(Event.status == osEventSignal)
    {//接收到一帧数据
      osMutexWait (MutexGetTempHandle, 3);
      if((Rs422RxData.Sensor.Head == 0x4c)
         && (crc16(Rs422RxData.Char, HeaterComm.DataLength - 2) == Rs422RxData.Sensor.Crc))
      {
        HeadData.Sensor.NtcTemp = Rs422RxData.Sensor.NtcTemp;
        for(uint8_t i=0; i<3; i++)
        {
          HeadData.Sensor.TcTemp[i].Data  = Rs422RxData.Sensor.TcTemp[i].Data;
//          HeadData.Sensor.TcTemp[i].Value   = Rs422RxData.Sensor.TcTemp[i].Value;
        }
        HeaterComm.CommStatus = 1;
      }
      else
      {
        TestData++;
        //        HeaterComm.DataLength = 0;
      }
      HeaterComm.DataLength = 0;
      osMutexRelease (MutexGetTempHandle);
      HAL_UART_Receive_DMA(&huart6, Rs422RxData.Char, 32);
    }
    else
    {//接收超时
      HeaterComm.CommStatus = 0;
    }
    xEventGroupSetBits(xCreatedEventGroup, EVENT_BIT_HEATER_COMM_TASK);
    osThreadYield();
  }
  /* USER CODE END HeaterCommTask */
}

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

12

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版