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

stm32f411串口数据发送问题

[复制链接]
bindwood123 提问时间:2017-2-19 10:14 /
下面是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!");
}

<
收藏 2 评论15 发布时间:2017-2-19 10:14

举报

15个回答
bindwood123 回答时间:2017-3-4 20:57:34
经过一段时间的努力,终于找到了问题的原因,在于外部时钟的频率与默认值不一致所致,修改一下外部时钟的宏定义就可以了。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2 结贴奖励

查看全部评分

bindwood123 回答时间:2017-2-19 12:05:19
第一次发帖,大神们看过来
zoomdy 回答时间:2017-2-19 21:04:51
始终无法得到正确的数据

是压根没收到数据呢?还是接收到的数据长度不对?还是接收的数据不匹配?
zoomdy 回答时间:2017-2-19 21:07:07
你这个程序连上仿真器在fputc设个断点调试一把,一下子就清楚了呀。还是要用上工具,不要盲调。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

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;  是干嘛的,去掉!

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

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,令人不解
12下一页

所属标签

相似问题

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