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

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 评论16 发布时间:2017-2-19 10:14

举报

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

评分

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

查看全部评分

bindwood123 回答时间:2017-2-20 20:43:44
        for(;;)
  {
      while(RESET == USART_GetFlagStatus(USART1,USART_FLAG_TXE));
      USART_SendData(USART1,'a');

      delay_ms(1000);
  }
衔胆栖冰 回答时间: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-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函数是会缓存输出的,直到缓存满或碰到换行符才会真正输出。
bindwood123 回答时间:2017-2-20 20:40:43
重定向函数也去掉了,让程序重复输出`a`,结果在串口调试助手上接收到的十六进制数是1C 00 FC ,怪事
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,令人不解
bindwood123 回答时间:2017-2-20 20:49:14
感觉串口设置还缺点啥
zbber 回答时间:2017-2-20 21:14:09
重定向函数也去掉了,让程序重复输出`a`,结果在串口调试助手上接收到的十六进制数是1C 00 FC
zoomdy 回答时间:2017-2-20 21:52:19
bindwood123 发表于 2017-2-20 20:48
收到了数据,但是与发送的不一致。比如发送字符a,得到的数据以十六进制显示为1C 00 FC,令人不解 ...

波特率没搞对?
bindwood123 回答时间:2017-2-21 20:12:11
代码中的波特率和串口助手中的是一致的,9600和115200都试过了。
bindwood123 回答时间:2017-2-21 20:14:44
我用的是stm32f411,感觉这个型号的片子有什么特殊之处。
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版