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

stm32f411串口收发数据量不一致的问题

[复制链接]
bindwood123 提问时间:2017-3-4 21:11 /
用串口1进行通信,上位机用串口调试助手发送数据并进行接收,结果发现上位机接收到的数据少于上位机发送的数据,也就是stm32接收数据有丢失现象,请帮忙看一下代码哪里出了问题。


#include <stdio.h>
#include "main.h"

void delay_ms(u16 time)
{
  u16 i=0;
        while(time--)
        {
    i=12000;
                while(i--);
        }
}


//配置UART1接收中断
void NVIC_Configuration(void)
{
        NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
//        USART_ITConfig(USART1,USART_IT_TXE,ENABLE);                //允许串口1发送中断。
  USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);               //允许串口1接收中断。
       
  NVIC_InitTypeDef NVIC_InitStructure;
  /* Configure the NVIC Preemption Priority Bits */  
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

  /* Enable the USARTy Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;     
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}


void USART1_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
       

    //PB6->TX  PB7->Rx
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);       

    GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_USART1);
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_USART1);
}



void USART1_Config(void)
{
        USART1_GPIO_Config();

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
       
  USART_InitTypeDef USART_InitStructure;

  USART_InitStructure.USART_BaudRate = 115200;
  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_Tx | USART_Mode_Rx;
       
  USART_Init(USART1, &USART_InitStructure);
       
  USART_Cmd(USART1,ENABLE);                                  //启动串口  
  USART_ClearFlag(USART1,USART_FLAG_TC);                     //发送完成标志位        
       
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);             // 打开中断  
  USART_ITConfig(USART1, USART_IT_ORE, ENABLE);

}   





void USART1_IRQHandler(void)
{
  uint8_t ch;

  if (USART_GetITStatus(USART1, USART_IT_ORE) == SET)  
  {  
    USART_ClearITPendingBit(USART1,USART_IT_ORE);      
    USART_ReceiveData( USART1 );   
  }
               
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {
    USART_ClearFlag(USART1,USART_FLAG_RXNE);  
    USART_ClearITPendingBit(USART1, USART_IT_RXNE);

    ch = USART1->DR;
    ch = USART_ReceiveData(USART1);     //接受数据

                USART_SendData(USART1,ch);
                while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

  }

}



int fputc(int ch,FILE *f)
{
//   USART1->SR;
          USART_GetFlagStatus(USART1, USART_FLAG_TC);// 解决第一个字符发送失败的问题
    //一个一个发送字符
    USART_SendData(USART1, (unsigned char) ch);
    //等待发送完成
    while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);

    return(ch);
}

int fgetc(FILE *f)
{
   /* 等待串口1输入数据 */
   while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);

   return (int)USART_ReceiveData(USART1);
}

int main(void)
{
        NVIC_Configuration();
  // USART1 config 9600 8-N-1
  USART1_Config();

        for(;;)
  {               
               

  }

}


收藏 1 评论9 发布时间:2017-3-4 21:11

举报

9个回答
zoomdy 回答时间:2017-3-4 21:44:45
把USART1_IRQHandler函数中的while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);去掉
zoomdy 回答时间:2017-3-4 21:46:44
  1.     ch = USART1->DR;
  2.     ch = USART_ReceiveData(USART1);     //接受数据
复制代码

这两行代码功能重复了吧
bindwood123 回答时间:2017-3-5 09:11:46
zoomdy 发表于 2017-3-4 21:46
这两行代码功能重复了吧

代码修改了,数据还是丢。
bindwood123 回答时间:2017-3-5 09:17:27
感觉丢的更多了。
无标题.png
ddllxxrr 回答时间:2017-3-5 17:11:53
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;


不能这样吧,应设为TX是输出,而RX是浮空输入
zts329547875 回答时间:2017-3-6 10:40:42
换个软件试试
回答时间:2017-3-6 10:49:43
中断接收不要去发送数据,接收到一个缓冲区中,中断中发送肯定会影响。
xmshao 回答时间:2017-3-6 17:32:57
代码写得有点乱。这么多热心朋友,替楼主赞下!

1、6楼指出的管脚配置的问题,你的管脚配置不完整。
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Pin = USARTx_TX_PIN;
。。。。
2、还有板凳指出的代码重复问题‘。
3、你检查下两边波特率是否一致;先可以把波特率放低点调试。
4、程序逻辑要你自己静心好好理下。官方有UART应用代码,你可以参考。
bindwood123 回答时间:2017-3-6 20:23:32
确实很感谢各位,各位提出的问题我一点点试,有了结果告诉大家。

所属标签

相似问题

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