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

紧急求助,串口接收数据出错何解?

[复制链接]
yongge2000 提问时间:2020-12-11 11:51 /
使用STM32  HAL生成的程序,串口接收数据出错。使用HAL_UART_Receive_IT(&huart2,(uint8_t *)&aRxBuffer,1)接收数据,然后串口中断里每接收一个数据,继续使用这个HAL_UART_Receive_IT(&huart2,(uint8_t *)&aRxBuffer,1)接收。使用中会出现 不接收的问题。。这个子程序之前看网上贴子。是因为同时可能在发送,子程序里面那个 lock 无法实现,所以已经去除。后面有所改善,但发现最终没有解决
微信图片_20201211114844.png
1 收藏 评论7 发布时间:2020-12-11 11:51

举报

7个回答
小歆-2051663 回答时间:2020-12-11 12:16:59
你分上面分析的很对,但是中断函数代码写的很乱。
中断函数里面拿到接收的数据后,直接调用 HAL_UART_Receive_IT(&huart2,(uint8_t *)&aRxBuffer,1) 函数就可以了。
yongge2000 回答时间:2020-12-11 12:33:27
小歆-2051663 发表于 2020-12-11 12:16
你分上面分析的很对,但是中断函数代码写的很乱。
中断函数里面拿到接收的数据后,直接调用 HAL_UART_Recei ...

感谢但是我的程序员(我是负责测试的)答复:

刚那个不是中断接收函数
我也做了他说的 没改善
废鱼 回答时间:2020-12-11 13:32:51
用不习惯HAL库的,在生成的时候可以选择LL库。
yongge2000 回答时间:2020-12-11 15:54:24
安 发表于 2020-12-11 13:32
用不习惯HAL库的,在生成的时候可以选择LL库。

谢谢楼上的 我试试看
烟花 回答时间:2020-12-12 14:05:29
这个改起来很麻烦!这样改吧,用DMA+空闲中断,很好用
void USART1_IRQHandler(void)
{
        volatile uint32_t mu_flag = 0;
        volatile uint32_t mu;
        mu_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE);
        if((mu_flag != RESET))
        {
                __HAL_UART_CLEAR_IDLEFLAG(&huart1);
                mu = huart1.Instance->SR;  
                mu = huart1.Instance->DR;
                HAL_UART_DMAStop(&huart1);
                recv_end_flag = 1;        //这个标志位是全局
         }
  //HAL_UART_IRQHandler(&huart1);//这个注释掉
}
然后在初始化函数里面加上
/* USER CODE BEGIN 2 */
        __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//
  HAL_UART_Receive_DMA(&huart1,Rxbuff,BUFFER_SIZE);//
/* USER CODE END 2 */
hjl2832 回答时间:2020-12-16 09:19:11
没碰到过这样的问题
butterflyspring 回答时间:2020-12-21 14:50:39
那个lock 对于新版本的库已经改进了,进行了区分。这个还是必要的,防止重入。 一般在接收完成回调函数中处理完后,可以考虑退出后立刻再调用串口接收函数。 另外,很多接收出错的情况也会跟时钟精度有关,导致接收数据不对。

所属标签

相似问题

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