stm32f411串口数据发送代码无法得到正确的数据

2019-07-14 14:15发布

下面是STM32f411的串口数据发送代码,上位机通过串口调试助手进行接收,始终无法得到正确的数据,请大神们帮忙看一下:
#include <stdio.h>
#include "main.h"

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;//9600;
  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);
}   



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

    return(ch);
}


int main(void)
{
  USART1_Config();   
  printf("hello world!");
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
60user58
1楼-- · 2019-07-14 17:57
是压根没收到数据呢?还是接收到的数据长度不对?还是接收的数据不匹配?
60user58
2楼-- · 2019-07-14 19:21
你这个程序连上仿真器在fputc设个断点调试一把,一下子就清楚了呀。还是要用上工具,不要盲调。
60user58
3楼-- · 2019-07-14 23:55
按照我对printf的认识,printf函数是会缓存输出的,直到缓存满或碰到换行符才会真正输出。
易元空灭
4楼-- · 2019-07-15 04:08
先把int fputc(int ch,FILE *f)去掉,直接调USART_SendData发一个字节看看正确不。如果正确,看你的重定向函数哪里有问题,如果不正确,看你的初始化和硬件有没有问题。还有,你的int fputc函数中的USART1->SR;  是干嘛的,去掉!
UserMen
5楼-- · 2019-07-15 06:26
 精彩回答 2  元偷偷看……
UserMen
6楼-- · 2019-07-15 06:56
        for(;;)
  {
      while(RESET == USART_GetFlagStatus(USART1,USART_FLAG_TXE));
      USART_SendData(USART1,'a');

      delay_ms(1000);
  }

一周热门 更多>