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

定时发送数据的时候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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版