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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版