OpenEdv-开源电子网

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

关于STM32F103串口接收缓冲区的问题

[复制链接]

11

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2017-10-29
在线时间
150 小时
发表于 2018-1-20 12:03:46 | 显示全部楼层 |阅读模式
STM32F103串口2,接收到数据之后,再次发送数据串口接收缓冲区的数据没有被覆盖,接收不到数据了,这个怎么办?
void Usart2_Init(u32 bound)
        {
  //GPIO¶Ë¿úéèÖÃ
  GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
         
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);

        //USART2_TX   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  //USART2_RX         
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
               
        //¿aÆôó3éä
        GPIO_PinRemapConfig(GPIO_Remap_USART2,ENABLE);

   //USART 3õê¼»ˉéèÖÃ

        USART_InitStructure.USART_BaudRate = bound;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;       
  USART_Init(USART2, &USART_InitStructure);
#if EN_USART2_RX       
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
#endif
  USART_Cmd(USART2, ENABLE);

}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6745
金钱
6745
注册时间
2017-4-12
在线时间
1258 小时
发表于 2018-1-21 16:17:23 | 显示全部楼层
繁星之下 发表于 2018-1-21 15:21
传了,麻烦看下,谢谢!!!!

仿真看到,你LCDshownum函数里内的temp值会改变啊,每次串口发送不同的数据都会做出相应的改变
33.png
22.png
11.png
回复 支持 1 反对 0

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6745
金钱
6745
注册时间
2017-4-12
在线时间
1258 小时
发表于 2018-1-21 10:37:06 | 显示全部楼层
看下你的中断函数吧
回复 支持 反对

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6745
金钱
6745
注册时间
2017-4-12
在线时间
1258 小时
发表于 2018-1-21 10:38:01 | 显示全部楼层
数据保存在数组里,完成一次接受后,计数标志有没清零
回复 支持 反对

使用道具 举报

11

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2017-10-29
在线时间
150 小时
 楼主| 发表于 2018-1-21 11:14:36 | 显示全部楼层
245925587 发表于 2018-1-21 10:38
数据保存在数组里,完成一次接受后,计数标志有没清零

void USART2_IRQHandler(void)
{
#ifdef OS_TICKS_PER_SEC
OSIntEnter();
#endif
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
           while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET){}
           data[0]=(USART_ReceiveData(USART2) & 0x7F);
                         USART_SendData(USART2,data[0]);
                         
                 USART_ClearITPendingBit(USART2,USART_IT_RXNE);
}       
else
{
data[0]=0;
        USART_ClearITPendingBit(USART2,USART_IT_RXNE);
}

#ifdef OS_TICKS_PER_SEC
OSIntEnter();
#endif

}
回复 支持 反对

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6745
金钱
6745
注册时间
2017-4-12
在线时间
1258 小时
发表于 2018-1-21 11:50:48 | 显示全部楼层
// while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET){}

把这句注释试一下呗
回复 支持 反对

使用道具 举报

11

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2017-10-29
在线时间
150 小时
 楼主| 发表于 2018-1-21 14:24:57 | 显示全部楼层
245925587 发表于 2018-1-21 11:50
// while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET){}

把这句注释试一下呗

注释了还是不行,发到电脑上的是对的,但是显示到LCD上的就不行了,第一次发任何数字,LCD显示的都是10,之后不管再发什么都不再变了
回复 支持 反对

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6745
金钱
6745
注册时间
2017-4-12
在线时间
1258 小时
发表于 2018-1-21 15:07:29 | 显示全部楼层
上个完整的代码吧
回复 支持 反对

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6745
金钱
6745
注册时间
2017-4-12
在线时间
1258 小时
发表于 2018-1-21 15:08:24 | 显示全部楼层
繁星之下 发表于 2018-1-21 14:24
注释了还是不行,发到电脑上的是对的,但是显示到LCD上的就不行了,第一次发任何数字,LCD显示的都是10, ...

如果发送到电脑上是对的话,这就不是串口接收的问题了
回复 支持 反对

使用道具 举报

11

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2017-10-29
在线时间
150 小时
 楼主| 发表于 2018-1-21 15:21:31 | 显示全部楼层
245925587 发表于 2018-1-21 15:08
如果发送到电脑上是对的话,这就不是串口接收的问题了

传了,麻烦看下,谢谢!!!!

123.zip

6.32 MB, 下载次数: 542

回复 支持 反对

使用道具 举报

11

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
490
金钱
490
注册时间
2017-10-29
在线时间
150 小时
 楼主| 发表于 2018-1-21 16:34:49 | 显示全部楼层
245925587 发表于 2018-1-21 16:17
仿真看到,你LCDshownum函数里内的temp值会改变啊,每次串口发送不同的数据都会做出相应的改变

原来如此,这么说来是LCD的问题,寄存器都会变,屏幕显示不会了,估计是屏幕的寄存器没更新,我去查查哪里的问题,非常感谢您的指导,谢谢!!
回复 支持 反对

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6745
金钱
6745
注册时间
2017-4-12
在线时间
1258 小时
发表于 2018-1-21 16:48:39 | 显示全部楼层
繁星之下 发表于 2018-1-21 16:34
原来如此,这么说来是LCD的问题,寄存器都会变,屏幕显示不会了,估计是屏幕的寄存器没更新,我去查查哪 ...

不用客气,其实也没有帮助到你什么
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 08:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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