bindwood123 发表于 2017-2-19 10:14:04

stm32f411串口数据发送问题

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

void USART1_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

    //PB6->TXPB7->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!");
}

bindwood123 发表于 2017-3-4 20:57:34

经过一段时间的努力,终于找到了问题的原因,在于外部时钟的频率与默认值不一致所致,修改一下外部时钟的宏定义就可以了。

bindwood123 发表于 2017-2-19 12:05:19

第一次发帖,大神们看过来:)

zoomdy 发表于 2017-2-19 21:04:51

始终无法得到正确的数据
是压根没收到数据呢?还是接收到的数据长度不对?还是接收的数据不匹配?

zoomdy 发表于 2017-2-19 21:07:07

你这个程序连上仿真器在fputc设个断点调试一把,一下子就清楚了呀。还是要用上工具,不要盲调。

zoomdy 发表于 2017-2-19 21:08:11

按照我对printf的认识,printf函数是会缓存输出的,直到缓存满或碰到换行符才会真正输出。

衔胆栖冰 发表于 2017-2-19 22:22:57

先把int fputc(int ch,FILE *f)去掉,直接调USART_SendData发一个字节看看正确不。如果正确,看你的重定向函数哪里有问题,如果不正确,看你的初始化和硬件有没有问题。还有,你的int fputc函数中的USART1->SR;是干嘛的,去掉!

bindwood123 发表于 2017-2-20 20:40:43

重定向函数也去掉了,让程序重复输出`a`,结果在串口调试助手上接收到的十六进制数是1C 00 FC ,怪事

bindwood123 发表于 2017-2-20 20:43:44

        for(;;)
{
      while(RESET == USART_GetFlagStatus(USART1,USART_FLAG_TXE));
      USART_SendData(USART1,'a');

      delay_ms(1000);
}

bindwood123 发表于 2017-2-20 20:46:23

zoomdy 发表于 2017-2-19 21:08
按照我对printf的认识,printf函数是会缓存输出的,直到缓存满或碰到换行符才会真正输出。 ...

从输出速度来看,确实不是每次都输出(printf和USART_SendData的效果一样),怎样才能每写一个字符输出一次呢?

bindwood123 发表于 2017-2-20 20:48:25

zoomdy 发表于 2017-2-19 21:04
是压根没收到数据呢?还是接收到的数据长度不对?还是接收的数据不匹配? ...

收到了数据,但是与发送的不一致。比如发送字符a,得到的数据以十六进制显示为1C 00 FC,令人不解
页: [1] 2
查看完整版本: stm32f411串口数据发送问题