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

有关STM32 HAL 库多个串口的回调函数问题

[复制链接]
冷眼1121 提问时间:2017-3-16 22:30 /
我使用的stm32的两路串口收发,两个串口接收中断处理有问题,我现在的处理方式是这样的
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
        {
                if(huart == &huart2)
        {
                                uRX_buf[RX_cont++] = RX_buf;
//                HAL_UART_Transmit_DMA(&huart2, uTX_buf, 8);
                                if(RX_cont>63)
                                {
                                        RX_cont=0;
                                }
                }
else        if(huart == &huart4)
        {
                                uRX_buf[RX_cont++] = RX_buf4;
                                if(RX_cont>63)
                                {
                                        RX_cont=0;
                                }
//                        HAL_UART_Receive_IT(&huart4,&RX_buf4,1);//¡ä??¨²?¨®¨º¨¹?D??

                }

我仿真看的确实是进了中断了,但是回调函数中的 else        if(huart == &huart4)执行不到,有么有用过的大神给点提示吧,谢谢!
收藏 1 评论11 发布时间:2017-3-16 22:30

举报

11个回答
废鱼 回答时间:2017-3-17 09:03:39
不能这么写,if(huart->Instance ==USART1 )
samhong 回答时间:2017-3-17 09:50:42
签到签到,早上好!
冷眼1121 回答时间:2017-3-17 09:53:16
安 发表于 2017-3-17 09:03
不能这么写,if(huart->Instance ==USART1 )

要改成if(huart->Instance ==USART1 )吗>?
冷眼1121 回答时间:2017-3-17 09:54:39
冷眼1121 发表于 2017-3-17 09:53
要改成if(huart->Instance ==USART1 )吗>?

好的我在试下看看 ,谢谢!
废鱼 回答时间:2017-3-17 10:09:10
是的。判断接口。你可以看一下stm32f4xx_hal_msp.c里面怎么写。参考一下。
冷眼1121 回答时间:2017-3-17 11:10:53
安 发表于 2017-3-17 09:03
不能这么写,if(huart->Instance ==USART1 )

大神,你这个方式好像行不通阿回调函数的传递参数只有一个void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
像你这样的写法会报错.
废鱼 回答时间:2017-3-17 13:37:51
如下类似代码:
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  if(huart->Instance==USART1)
  {
  /* USER CODE BEGIN USART1_MspInit 0 */

  /* USER CODE END USART1_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_USART1_CLK_ENABLE();
  
    /**USART1 GPIO Configuration   
    PA9     ------> USART1_TX
    PA10     ------> USART1_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* USER CODE BEGIN USART1_MspInit 1 */

  /* USER CODE END USART1_MspInit 1 */
  }

}
冷眼1121 回答时间:2017-3-17 13:59:08
安 发表于 2017-3-17 13:37
如下类似代码:
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{

谢谢,我找到了这一段代码了,我的问题已经解决了,我的问题其实主要是 两个串口我用的模式不一样一个用的DMA 另一个用的一个用的接收中断,所以产生中断的方式不一样而且我开启的接收中断里面的只接收了一次所哟导致我的中断里面只能接受到一次数据。看来不是中断的问题应该是处理的问题,谢谢你回复我。
奏奏奏 回答时间:2017-3-17 14:01:43
冷眼1121 发表于 2017-3-17 09:54
好的我在试下看看 ,谢谢!

楼主这么写没有毛病
我做的项目里面区分串口也是这么写的
if(huart == &huart4)
我觉得问题不在这个地方,先查查其他代码的问题
奏奏奏 回答时间:2017-3-17 14:06:29
楼主如果是接收固定帧尾结束的数据帧
可以参考以下我的贴的代码

  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  2. {
  3.         if(huart == &huart2)
  4.   {
  5.                 Rxbuff_UART2[Rx_count_UART2] = aaRxBuffer_UART2[0];
  6.                
  7.                
  8.                 if((Rxbuff_UART2[Rx_count_UART2-3] == 0xFF)&&(Rxbuff_UART2[Rx_count_UART2-2] == 0xFC))
  9.                 {
  10.                         Rx_Num_UART2 = ++Rx_count_UART2;
  11.                         Rx_count_UART2 = 0;
  12.                                
  13.                 }
  14.                 else Rx_count_UART2++;
  15.                 HAL_UART_Receive_IT(&huart2,(uint8_t*)aaRxBuffer_UART2,1);
  16.   }
  17. }
复制代码


冷眼1121 回答时间:2017-3-17 16:37:52
奏奏奏 发表于 2017-3-17 14:01
楼主这么写没有毛病
我做的项目里面区分串口也是这么写的
if(huart == &huart4)

是的,这么写确实没毛病您给提供的思路我看了下,应该也是可行的就是把接收中断 的字符个数设置成1 每次进中断后需要重新再开启中断,相对来说比较麻烦一些 我换成了DMA 接收模式,设置成连续模式拉,应该能方便点,而且一般数据处理我不放在中断回调函数里面,这样对中断时效性有影响我在MAIN 里面处理的。非常感谢您能够给我提供思路。希望以后能多交流。

评分

参与人数 1ST金币 +5 收起 理由
zero99 + 5 结贴奖励

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版