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

STM32串口接收中断疑问 求解?

[复制链接]
zhong5411 提问时间:2021-8-9 17:37 / 未解决
Snipaste_2021-08-09_17-38-14.png
如上图所示,外部大约间隔1s左右传输一帧数据过来,正常情况下是一帧5个字节.如果采用接收中断的方式接收数据HAL_UART_Receive_IT(&huart1, (uint8_t *)&Uart1_Rxdata, 5);      假如数据正常传输过程种,中间突然出现了一帧数据为4个字节,那处理器会丢掉这一帧数据吗?  还是将这一帧4个字节 + 下一帧的第一个字节 组成5个字节的数据,产生接收中断?

再假如数据正常传输过程种,中间突然出现了一帧数据为6个字节,那处理器会丢掉这一帧数据吗?  还是将这一帧数据的前5个字节一起产生接收中断,剩下一个字节丢弃?
收藏 评论5 发布时间:2021-8-9 17:37

举报

5个回答
废鱼 回答时间:2021-8-10 09:34:26
如果丢失一个,会把后面的数据连接起来。楼主可以考虑使用空闲中断或者中断队列的方式,将所有接收到的数据放入到缓冲区中,保证数据的完整性。
zhong5411 回答时间:2021-8-10 16:18:46
飞羽一条 发表于 2021-8-10 09:34
如果丢失一个,会把后面的数据连接起来。楼主可以考虑使用空闲中断或者中断队列的方式,将所有接收到的数据 ...

首先非常感谢您的耐心解答,我也看了一些空闲中断的介绍文档,但是没有用过这种方式,还有一点儿疑问。我的硬件是STM32f405,工作频率168M,有两路串口要不停的接收帧协议数据,每一帧7个字节,波特率是2M,数据量应该是特别大的,因为我需要解析帧协议,所以想采用单字节接收中断的方式,也就是HAL_UART_Receive_IT(&huart1,(uint8_t *)&Uart1_Rxdata, 1); 这种方式是不是不太好,不是最佳的方式?是不是会让CPU负担很重?如果是的话,能通过什么方式可以测出CPU现在负担有多重?(是不是可以通过在中断回调函数的起始和终点处设置IO电平翻转来看中断函数执行时间和频率,去确定CPU当前的负担?)
对于我这种2M波特率,需要帧协议解析(帧长度固定)的情况,最佳的方式是?
QIANYING79 回答时间:2021-8-11 11:56:57
考虑使用串口空闲中断加DMA的方式接收
yklstudent 回答时间:2021-8-11 14:48:28
USART+DMA+IDLE组合就可以满足你的要求,当然USART+TIM组合也可以,建议前者
yr 回答时间:2021-8-13 15:45:37
相邻两帧之间的时间1s,应该足够mcu解析。1. 可以考虑DMA接收结合空闲中断,库函数如下,鉴于每一帧字节数目可能变动,所以DMA传输的字节要最大,因此,退出条件或者是接收到规定数目字节的数据或者Rx空闲。

/**
  * @brief Receive an amount of data in DMA mode till either the expected number
  *        of data is received or an IDLE event occurs.
  * @note  Reception is initiated by this function call. Further progress of reception is achieved thanks
  *        to DMA services, transferring automatically received data elements in user reception buffer and
  *        calling registered callbacks at half/end of reception. UART IDLE events are also used to consider
  *        reception phase as ended. In all cases, callback execution will indicate number of received data elements.
  * @note  When the UART parity is enabled (PCE = 1), the received data contain
  *        the parity bit (MSB position).
  * @note  When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
  *        the received data is handled as a set of uint16_t. In this case, Size must indicate the number
  *        of uint16_t available through pData.
  * @param huart UART handle.
  * @param pData Pointer to data buffer (uint8_t or uint16_t data elements).
  * @param Size  Amount of data elements (uint8_t or uint16_t) to be received.
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
  HAL_StatusTypeDef status;

(略)

2. 回调函数如下,其中返回Size为实际接收到的数据,接收缓冲从0到Size-1就是数据,解析协议应该在这里执行。
/**
  * @brief  Reception Event Callback (Rx event notification called after use of advanced reception service).
  * @param  huart UART handle
  * @param  Size  Number of data available in application reception buffer (indicates a position in
  *               reception buffer until which, data are available)
  * @retval None
  */
__weak void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  UNUSED(Size);

  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_UARTEx_RxEventCallback can be implemented in the user file.
   */
}



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