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

关于HAL_UART_Receive_IT和HAL_UART_Transmit一起用的问题

[复制链接]
D5Power 提问时间:2017-11-16 21:11 /
波特率为4800.
在中断中调用HAL_UART_Receive_IT继续进行下次中断,除此之外没有任何其他代码。
然后在主循环里调用HAL_UART_Transmit发送数据,就有一定可能导致再也进不到中断里。这是为什么呢?

最开始我以为是因为波特率低,我设置的最大发送时间太短导致的。后来改长时间后,发现依然有几率出现这样的问题。

请问HAL_UART_Transmit是否会造成了串口被锁,或者处于繁忙状态,是否能够恢复?或者有什么方法可以检测
收藏 1 评论13 发布时间:2017-11-16 21:11

举报

13个回答
wenyangzeng 回答时间:2017-11-16 21:43:13
本帖最后由 wenyangzeng 于 2017-11-16 21:44 编辑

主函数加入:__HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);
就可以不断进入中断了。

评分

参与人数 2ST金币 +4 收起 理由
D5Power + 2 很给力!
zero99 + 2

查看全部评分

D5Power 回答时间:2017-11-17 00:40:01
wenyangzeng 发表于 2017-11-16 21:43
主函数加入:__HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);
就可以不断进入中断了。

非常感谢!!今天太晚了。明天试一下!!
D5Power 回答时间:2017-11-17 00:40:30
wenyangzeng 发表于 2017-11-16 21:43
主函数加入:__HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);
就可以不断进入中断了。

非常感谢!我明天一早就试一下!
D5Power 回答时间:2017-11-17 00:41:33
非常感谢!我明天一早就试一下!
zero99 回答时间:2017-11-20 13:56:19
D5Power 发表于 2017-11-17 00:41
非常感谢!我明天一早就试一下!

楼主问题解决了吗
D5Power 回答时间:2017-11-20 21:58:33
zero99 发表于 2017-11-20 13:56
楼主问题解决了吗

解决了一部分。所以没有来回复下定论。目前定期的发送是没问题了。但是连续进行回复,如:
HAL_UART_Transmit(&huart2,p,12,0xffff);
HAL_UART_Transmit(&huart2,p,12,0xffff);

还是会出现卡死的情况。
wenyangzeng 回答时间:2017-11-20 22:18:50
D5Power 发表于 2017-11-20 21:58
解决了一部分。所以没有来回复下定论。目前定期的发送是没问题了。但是连续进行回复,如:
HAL_UART_Tran ...

HAL_UART_Transmit(&huart2,p,24,0xffff);
一次发送24字节不就OK了?

评分

参与人数 1ST金币 +1 收起 理由
D5Power + 1

查看全部评分

D5Power 回答时间:2017-11-21 16:36:13
wenyangzeng 发表于 2017-11-20 22:18
HAL_UART_Transmit(&huart2,p,24,0xffff);
一次发送24字节不就OK了?

感谢回复。我明白你的意思,每次循环,把要发送的数据,按照协议连成一个二进制流,然后一起发送就可以解决了。

我就是好奇,是不是这个问题无法解决。是由于单片机的处理速度决定的吗?
modu8888 回答时间:2018-3-7 10:53:53
妈蛋  我也遇到这个问题了。
modu8888 回答时间:2018-3-7 13:24:00
本帖最后由 modu8888 于 2018-3-8 10:27 编辑


我的F4里面这样:
                                __HAL_UART_DISABLE_IT(&UART1_Handler,UART_IT_RXNE);
                                HAL_UART_Transmit(&UART1_Handler,&mb_buf_out[0],6,100);                                __HAL_UART_ENABLE_IT(&UART1_Handler,UART_IT_RXNE);
                                HAL_UART_Receive_IT(&UART1_Handler,&RxData, 1);
F1里面这样:
                                __HAL_UART_DISABLE_IT(&huart2,UART_IT_RXNE);
                                HAL_UART_Transmit(&huart2,&i,1,100);               
                                __HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);
                                HAL_UART_Receive_IT(&huart2,&aRxBuffer,1);        

wpgdut 回答时间:2019-1-3 23:21:18
谢谢分享,解决了我一个困惑很久的问题。原本串口也是使用查询发送和中断接收,但是在有接收的同时进行发送,就会导致死锁,然后再也进不去中断。将中断接收改为DMA接收解决了这个问题。
有阵雨 回答时间:2019-11-15 20:21:27
wenyangzeng 发表于 2017-11-16 21:43
主函数加入:__HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);
就可以不断进入中断了。

我试了不行,你们这样就可以吗?
雨山 回答时间:2020-7-2 11:08:28
在发送、接收之前关闭中断__HAL_UART_DISABLE_IT(&huart2,UART_IT_RXNE);在之后再打开中断__HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);就好了

所属标签

相似问题

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