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

HAL库多个串口无法进其中一个中断的问题

[复制链接]
wdliming-222461 提问时间:2019-8-2 20:51 /
本人用串口1和串口4分别进行中断的接受,
在初始化之后,首先在main函数中
调用:
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); //添加开启接收中断的语句:
HAL_UART_Receive_IT(&huart4, (uint8_t *)&bRxBuffer, 1);
aRxBuffer
bRxBuffer
为全局变量,

callbak函数为;
  • void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  • {
  •     if (huart->Instance == USART1) //如果是串口1
  •     {
  •         if (USART1_Rx_Cnt >= 255) //溢出判断
  •         {
  •             USART1_Rx_Cnt = 0;
  •             memset(USART1_RxBuff, 0x00, sizeof(USART1_RxBuff));
  •             //可以做一些命令
  •                         RS485PA8_TX;
  •             HAL_UART_Transmit(&huart1, (uint8_t *)&cAlarmStr, sizeof(cAlarmStr), 0xFFFF);
  •                         RS485PA8_RX;
  •         }
  •         else
  •         {
  •             USART1_RxBuff[USART1_Rx_Cnt++] = aRxBuffer;   //接收数据转存
  •             //判断结束符,LF=0x0a, 0x0d=CR,意为回车换行,后期可修改
  •             if ((USART1_RxBuff[USART1_Rx_Cnt - 1] == 0x0A) && (USART1_RxBuff[USART1_Rx_Cnt - 2] == 0x0D)) //判断结束位
  •             {
  •                 //can do some action eg: send USART1_RxBuff using freertos's queue
  •                 //UART1_CallBack(UART4_RxBuff, ctn);
  •                                 RS485PA8_TX;
  •                 HAL_UART_Transmit(&huart1, (uint8_t *)&USART1_RxBuff, USART1_Rx_Cnt, 0xFFFF); //将收到的信息发送出去
  •                 RS485PA8_RX;
  •                                 USART1_Rx_Cnt = 0;
  •                 memset(USART1_RxBuff, 0, sizeof(USART1_RxBuff)); //清空数组
  •             }
  •         }
  •         HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);   //再开启接收中断
  •     }
  •     else if (huart->Instance == UART4) //如果是串口4
  •     {
  •         if (UART4_Rx_Cnt >= 255) //溢出判断
  •         {
  •             UART4_Rx_Cnt = 0;
  •             memset(UART4_RxBuff, 0x00, sizeof(UART4_RxBuff));
  •             //可以做一些命令
  •                         RS485PC9_TX;
  •             HAL_UART_Transmit(&huart4, (uint8_t *)&cAlarmStr, sizeof(cAlarmStr), 0xFFFF);
  •                         RS485PC9_RX;
  •         }
  •         else
  •         {
  •             UART4_RxBuff[UART4_Rx_Cnt++] = bRxBuffer;   //接收数据转存
  •             //判断结束符,LF=0x0a, 0x0d=CR,意为回车换行,后期可修改
  •             if ((UART4_RxBuff[UART4_Rx_Cnt - 1] == 0x0A) && (UART4_RxBuff[UART4_Rx_Cnt - 2] == 0x0D)) //判断结束位
  •             {
  •                 //can do some action eg: send UART4_RxBuff using freertos's queue
  •                 //UART1_CallBack(UART4_RxBuff, ctn);
  •                                 RS485PC9_TX;
  •                 HAL_UART_Transmit(&huart4, (uint8_t *)&UART4_RxBuff, UART4_Rx_Cnt, 0xFFFF); //将收到的信息发送出去
  •                                 RS485PC9_RX;
  •                 UART4_Rx_Cnt = 0;
  •                 memset(UART4_RxBuff, 0, sizeof(UART4_RxBuff)); //清空数组
  •             }
  •         }
  •         HAL_UART_Receive_IT(&huart4, (uint8_t *)&bRxBuffer, 1);   //再开启接收中断
  •     }
  • }

[color=rgb(51, 102, 153) !important]复制代码

我在串口助手中发串口1,正常工作,但是硬件练到串口4中,就无法进中断,
请问这是为什么,
那位大侠指点下。谢谢
收藏 评论10 发布时间:2019-8-2 20:51

举报

10个回答
慎微 回答时间:2019-8-2 22:11:48
您的缓冲区仅收一字节就中断,对吗?HAL_UART_Receive_IT(&huart4, (uint8_t *)&bRxBuffer, 1);这样中段就很频繁,是不是串口4波特率比串口1高啊?

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

废鱼 回答时间:2019-8-3 08:56:11
串口4的配置是什么,确定串口4发送的数据也能收到吗?注意看一下串口4的硬件配置是否和实际接的IO一致。
傻猪卜爱哭啊 回答时间:2019-8-3 13:35:17
先看看不开中断是否能进行发送,然后看看 你中断使能了木有,要是使能了,就断电打在中断函数,慢慢来吧

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

ikxlf 回答时间:2019-8-4 14:10:56
我的问题是现在串口4无法中断,那你应该贴的代码不应该是中断回调代码而应该是串口4的初始化代码, 第二个问题就是你看你发个帖子错别字那么多,只能让我觉得你很毛躁,做代码需要冷静淡定还需要仔细。 个人的意见,你可以把你的初始化代码贴出来或者工程发出来
电子星辰 回答时间:2019-8-7 11:06:51
我觉得这种更有可能是粗心大意导致。可以先把串口1的代码注释测串口4,不行的话再全面检查一下有没有哪里不小心搞错了
butterflyspring 回答时间:2019-8-7 15:52:49
楼主没有发配置代码。请检查一下中断入口设置是否正确。当然像其他大神建议的单独跑UART4试试也能检查是不是中断源的问题和其配置。熟悉一点参考手册的描述就可以调试看看中断配置状态位是否正确,直接找到线索

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

wdliming-222461 回答时间:2019-8-9 20:53:54
butterflyspring 发表于 2019-8-7 15:52
楼主没有发配置代码。请检查一下中断入口设置是否正确。当然像其他大神建议的单独跑UART4试试也能检查是不 ...

已经解决了,谢谢啊,是因硬件上面的问题
wdliming-222461 回答时间:2019-8-9 20:54:39
安 发表于 2019-8-3 08:56
串口4的配置是什么,确定串口4发送的数据也能收到吗?注意看一下串口4的硬件配置是否和实际接的IO一致。 ...

嗯嗯
你说的对
wdliming-222461 回答时间:2019-8-9 20:55:52
mikecai 发表于 2019-8-2 22:11
您的缓冲区仅收一字节就中断,对吗?HAL_UART_Receive_IT(&huart4, (uint8_t *)&bRxBuffer, 1);这样中段就 ...

那要怎么改比较好??能够降低进中断的频率??
wdliming-222461 回答时间:2019-8-9 21:00:50
mikecai 发表于 2019-8-2 22:11
您的缓冲区仅收一字节就中断,对吗?HAL_UART_Receive_IT(&huart4, (uint8_t *)&bRxBuffer, 1);这样中段就 ...

那就是用空闲中断比较好了??

所属标签

相似问题

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