HAL库函数串口中断接收只能收到第一个字节

2019-07-14 15:45发布

首先介绍一下实验环境:单片机STM32f415
调试器:st-link

硬件初始化:
*串口波特率为614400
*采用定时器每隔500us触发一次串口中断发送
*发送完成后进入中断接收模式

定时器中断回调函数如下:

void HAL_tiM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
        if(htim==&htim14)
        {
                GYRO_Handle.cmd_GYRO=GYRO_CMD;               
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);                                  使能发送
                HAL_UART_Transmit_IT(&huart3, &GYRO_Handle.cmd_GYRO, 1);                         开启中断发送,然后进入发送模式
        }
}




发送完成后进入发送中断完成回调函数:
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
        if(huart==&huart3)
        {
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);                                使能接收
                HAL_UART_Receive_IT(&huart3, GYRO_Handle.frame_GYRO, 7);                        开启中断接收,然后进入接收模式
        }
}


接收中断完成回调函数:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
        if(huart==&huart3)
        {
                 用户函数区域
        }
}


实验结果:

发送没有问题,可成功发送。
接收只能收到第一个字节。
接收服务函数老是进入错误服务函数,错误号为数据溢出

已经分析两天了,还是没有找到问题,求大师分析。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
你我然后
1楼-- · 2019-07-14 21:20
HAL_UART_Receive_IT 不要放在HAL_UART_TxCpltCallback 里,放在主函数里,在初始化的时候调用,总之要在HAL_UART_Transmit_IT之前。
zhan81411
2楼-- · 2019-07-15 02:26
你我然后 发表于 2018-11-26 15:14
HAL_UART_Receive_IT 不要放在HAL_UART_TxCpltCallback 里,放在主函数里,在初始化的时候调用,总之要在HAL_UART_Transmit_IT之前。

改后如下
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
        if(htim==&htim14)
        {
                GYRO_Handle.cmd_GYRO=GYRO_CMD;               
                HAL_UART_Receive_IT(&huart3, GYRO_Handle.frame_GYRO, 7);       
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);       
                HAL_UART_Transmit_IT(&huart3, &GYRO_Handle.cmd_GYRO, 1);       
        }

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
        if(huart==&huart3)
        {
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);                       
        }
}

还是进入错误中断,无法进入接收完成中断
yisen282
3楼-- · 2019-07-15 05:57
关注!
波特率降低测试
zhan81411
4楼-- · 2019-07-15 07:45
 精彩回答 2  元偷偷看……
yisen282
5楼-- · 2019-07-15 11:49
通信距离有多远?用max3232?
你我然后
6楼-- · 2019-07-15 13:26
本帖最后由 党国特派员 于 2015-1-16 11:40 编辑

HAL_UART_Receive_IT 只需要调用一次。
还有就是你的接收函数里都干了些什么,会不会时间超长了。

一周热门 更多>