OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12484|回复: 14

STM32的HAL库串口中断接收数据全部为0

[复制链接]

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2017-7-2
在线时间
12 小时
发表于 2018-3-15 12:25:38 | 显示全部楼层 |阅读模式
1金钱
求助各位,stm32的HAL库有谁熟悉吗?我用串口中断接收,调用回调函数,能进中断,也能进回调函数,但数据一直是0。有朋友知道是什么问题吗?回调函数如下:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
        if(huart == &UartHandle)
        {
          UsartBuffer[UsartWptr++]=UsartRxByte;
          UsartWptr = UsartWptr%MAXBUFFER;//保证写位置值不溢出
          HAL_UART_Receive_IT(&UartHandle,&UsartRxByte,1);
        }
        return;
}

HAL_UART_Receive_IT(&UartHandle,&UsartRxByte,1);在主循环之前也执行一次了。

UsartRxByte一直是0.

UART初始化如下:
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
  GPIO_InitTypeDef  GPIO_InitStruct;

  /*##-1- Enable peripherals and GPIO Clocks #################################*/
  /* Enable GPIO TX/RX clock */
  USARTx_TX_GPIO_CLK_ENABLE();
  USARTx_RX_GPIO_CLK_ENABLE();


  /* Enable USARTx clock */
  USARTx_CLK_ENABLE();

  /*##-2- Configure peripheral GPIO ##########################################*/  
  /* UART TX GPIO pin configuration  */
  GPIO_InitStruct.Pin       = USARTx_TX_PIN;
  GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull      = GPIO_PULLUP;
  GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = USARTx_TX_AF;

  HAL_GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStruct);

  /* UART RX GPIO pin configuration  */
  GPIO_InitStruct.Pin = USARTx_RX_PIN;
  GPIO_InitStruct.Alternate = USARTx_RX_AF;

  HAL_GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStruct);

  /*##-3- Configure the NVIC for UART ########################################*/
  /* NVIC for USART */
  HAL_NVIC_SetPriority(USARTx_IRQn, 0, 1);
  HAL_NVIC_EnableIRQ(USARTx_IRQn);
}


谢谢!


最佳答案

查看完整内容[请看2#楼]

不要在串口中断里面用printf!!! 你下载我们例程测试,没毛病吧? 中断服务函数越精简越好。 而且你发数据的时候,占用了时间,自然收不到后面的数据。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-3-15 12:25:39 | 显示全部楼层
不要在串口中断里面用printf!!!
你下载我们例程测试,没毛病吧?
中断服务函数越精简越好。 而且你发数据的时候,占用了时间,自然收不到后面的数据。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-3-16 01:11:29 | 显示全部楼层
帮顶
回复

使用道具 举报

22

主题

117

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
798
金钱
798
注册时间
2015-10-24
在线时间
160 小时
发表于 2018-3-16 10:08:12 | 显示全部楼层
正点原子的开发板都是有HAL库版本的例程,你可以参考看看
回复

使用道具 举报

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2017-7-2
在线时间
12 小时
 楼主| 发表于 2018-3-16 17:14:28 | 显示全部楼层
谢谢两位。上面为0的问题解决了,是我其他地方配置错误。现在有个新的问题,如下:
我在回调函数中接收串口数据的UsartRxByte是一个字节,我用串口助手一次性发1个或2个均能正常接收,若超过2个,则只能接收到前两个,后面的全丢失了。
若我把接收的UsartRxByte改为数组,则一次性发的数据若小于等于数组维数,也能正常接收,但是若大于数组维数,则只能接收一次,后面再怎么发都不能进中断。

在网上查了很多资料,发现是出现了溢出错误(HAL_UART_ERROR_ORE),这个应该怎么解决呢?

==================================================
补充一下,我的串口波特率为115200,改为9600也不行。
回复

使用道具 举报

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2017-7-2
在线时间
12 小时
 楼主| 发表于 2018-3-16 17:35:50 | 显示全部楼层
和这个文章里描述的现象一样:
http://blog.csdn.net/qwe83877536/article/details/79344948
回复

使用道具 举报

4

主题

63

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1194
金钱
1194
注册时间
2017-8-31
在线时间
295 小时
发表于 2018-3-16 18:17:48 | 显示全部楼层
HAL库的串口用回调函数确实不怎么好使,我那时遇到的问题是串口接收大量数据,第一个数据总会被丢失,后来我是goto跳过他的回调函数,直接用寄存器方式接收的就好了,建议别用它的回调,调试它会烦死人的。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-3-17 01:26:25 | 显示全部楼层
hnxyxiaomeng 发表于 2018-3-16 17:14
谢谢两位。上面为0的问题解决了,是我其他地方配置错误。现在有个新的问题,如下:
我在回调函数中接收串 ...

对的,试试用寄存器,不要用回调函数。直接自己写中断服务函数。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2017-7-2
在线时间
12 小时
 楼主| 发表于 2018-3-18 11:36:43 | 显示全部楼层
本帖最后由 hnxyxiaomeng 于 2018-3-18 13:29 编辑
正点原子 发表于 2018-3-17 01:26
对的,试试用寄存器,不要用回调函数。直接自己写中断服务函数。

嗯,我自己研究了下寄存器的处理,不用回调函数,自己写中断服务函数,代码如下 :
void USART1_IRQHandler( void )
{
        uint8_t res;
        if(UartHandle.Instance->ISR & (1<<6)) //如果发送完成,置标志位
        {
                UartHandle.Instance->ISR &= ~(1<<6);//清发送完成标志
        }
        
        if(UartHandle.Instance->ISR & (1<<3)) //如果溢出错误
        {
                UartHandle.Instance->ICR |=  (1<<3);//清溢出错误
                printf("over\r\n");
        }
        
        if(UartHandle.Instance->ISR & (1<<5)) //如果接收完成
        {
                res = UartHandle.Instance->RDR;
                printf("%c",res);
                UartHandle.Instance->ISR &= ~(1<<5);//清RXNE标志
        }  
}

现在,我用串口助手给单片机发送123,则单片机返回的是:
1over
2
后面的数还是丢了。
但我手动再发123,还是能收到和上面同样的数据,说明串口设置没问题,就是溢出后,后面的数据丢了一些。
波特率设置为115200,设置为连续发送,10ms发送一次,每次发送12(两个字符),也没有问题。
不知道溢出错误出现后,怎么处理才能接到后面的数?
回复

使用道具 举报

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2017-7-2
在线时间
12 小时
 楼主| 发表于 2018-3-21 17:04:11 | 显示全部楼层
正点原子 发表于 2018-3-15 12:25
不要在串口中断里面用printf!!!
你下载我们例程测试,没毛病吧?
中断服务函数越精简越好。 而且你发 ...

printf去掉了也没解决。
用原子哥的407开发板测试,例程没毛病。。。
我这个是另一个片子,就不行了。。
回复

使用道具 举报

6

主题

315

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1669
金钱
1669
注册时间
2018-1-29
在线时间
160 小时
发表于 2018-3-21 21:47:11 | 显示全部楼层
奇了怪了!
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2018-7-11
在线时间
11 小时
发表于 2018-7-14 08:53:53 | 显示全部楼层
楼主可以发给我一下你的完整程序给我参考一下吗,我的邮箱c1996042@163.com 我也在处理类似的问题
回复

使用道具 举报

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2017-7-2
在线时间
12 小时
 楼主| 发表于 2018-7-29 18:18:46 | 显示全部楼层
xiaoouyang 发表于 2018-7-14 08:53
楼主可以发给我一下你的完整程序给我参考一下吗,我的邮箱 我也在处理类似的问题

你好,我至今也没解决。因为我知道另一端发送来的数据格式,所以我把接收端数组的维数设为很大就暂时用着了
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2018-7-11
在线时间
11 小时
发表于 2018-8-1 16:34:59 | 显示全部楼层
hnxyxiaomeng 发表于 2018-7-29 18:18
你好,我至今也没解决。因为我知道另一端发送来的数据格式,所以我把接收端数组的维数设为很大就暂时用着 ...

楼主我已经搞定了 用dma+串口中断做 只不过占用有点大 但是基本上实现还是没问题
回复

使用道具 举报

21

主题

55

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2018-12-5
在线时间
45 小时
发表于 2019-9-19 19:30:57 | 显示全部楼层
hnxyxiaomeng 发表于 2018-3-16 17:14
谢谢两位。上面为0的问题解决了,是我其他地方配置错误。现在有个新的问题,如下:
我在回调函数中接收串 ...

你好,请问是什么地方配置错误导致接收为0?我也遇到这个问题了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 01:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表