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

定时发送数据的时候HAL_UART_Receive_IT问题

[复制链接]
电子星辰 提问时间:2018-5-31 10:01 /
本帖最后由 电子星辰 于 2018-6-6 11:19 编辑

当我用串口HAL_UART_Transmit函数定时向上位机发送数据的同时,我需要不定时不定长的接收上位机数据。我用的是HAL_UART_Receive_IT函数,当我接收频率稍高就会进不了HAL_UART_Receive_IT函数。
那么除了将__HAL_LOCK(huart),__HAL_UNLOCK(huart)语句注释,和改为用HAL_UART_Transmit_IT发送外,还有没有其它方法?

解决方案:
目前为止我已知的方法包括:
1.将接收中断改为DMA接收。2.将__HAL_LOCK(huart),__HAL_UNLOCK(huart)语句注释。
1.DMA具体解决请看该贴:https://www.stmcu.org.cn/module/forum/thread-616097-1-1.html
另外我猜测:1.不使用HAL_UART_Transmit重定向的printf,改用HAL_UART_Transmit_IT发送。2.用寄存器或标准库对printf重定向。可能也可以解决该问题,暂未验证。

HAL_UART_Receive_IT函数里注释掉锁

HAL_UART_Receive_IT函数里注释掉锁
收藏 评论8 发布时间:2018-5-31 10:01

举报

8个回答
zhao.zhao 回答时间:2018-5-31 11:41:53
可以设置为每接收一个字节,进一次中断回调函数,对数据处理,这样效率低些,但是还是可行的。
电子星辰 回答时间:2018-5-31 12:01:44
zhao.zhao 发表于 2018-5-31 11:41
可以设置为每接收一个字节,进一次中断回调函数,对数据处理,这样效率低些,但是还是可行的。 ...

是的,我就是这样处理的。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
        if(USART_RX_STA < UART_RecSize)
        {
                r[USART_RX_STA] = aRxBuffer;
                USART_RX_STA++;
        }
        timer_count = 0;
        if(HAL_UART_Receive_IT(&huart1,&aRxBuffer,1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
}
xiaojie0513 回答时间:2018-5-31 12:26:56
dma传输

点评

DMA传输确实可以  发表于 2018-6-1 10:48
feixiang20 回答时间:2018-5-31 22:39:14
串口接受数据,定时器来判断超时是否接受数据完成。DMA接受+IDLE中断。是这么么
电子星辰 回答时间:2018-6-1 09:37:05
feixiang20 发表于 2018-5-31 22:39
串口接受数据,定时器来判断超时是否接受数据完成。DMA接受+IDLE中断。是这么么 ...

是的,不过我只用了串口接收中断,没用DMA和IDLE
电子星辰 回答时间:2018-6-1 10:48:20
本帖最后由 电子星辰 于 2018-6-1 10:51 编辑

DMA传输确实可以,谢谢你。

我用的是DMA循环接收模式,每次接收1字节,测试未出现串口接收中断的不能接收现象。

zhao.zhao 回答时间:2018-6-1 11:45:56
电子星辰 发表于 2018-5-31 12:01
是的,我就是这样处理的。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{

就是这样的,接收完了一个字节后,马上做判断处理

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版