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!");
}
经过一段时间的努力,终于找到了问题的原因,在于外部时钟的频率与默认值不一致所致,修改一下外部时钟的宏定义就可以了。 第一次发帖,大神们看过来:) 始终无法得到正确的数据
是压根没收到数据呢?还是接收到的数据长度不对?还是接收的数据不匹配? 你这个程序连上仿真器在fputc设个断点调试一把,一下子就清楚了呀。还是要用上工具,不要盲调。 按照我对printf的认识,printf函数是会缓存输出的,直到缓存满或碰到换行符才会真正输出。 先把int fputc(int ch,FILE *f)去掉,直接调USART_SendData发一个字节看看正确不。如果正确,看你的重定向函数哪里有问题,如果不正确,看你的初始化和硬件有没有问题。还有,你的int fputc函数中的USART1->SR;是干嘛的,去掉!
重定向函数也去掉了,让程序重复输出`a`,结果在串口调试助手上接收到的十六进制数是1C 00 FC ,怪事 for(;;)
{
while(RESET == USART_GetFlagStatus(USART1,USART_FLAG_TXE));
USART_SendData(USART1,'a');
delay_ms(1000);
} zoomdy 发表于 2017-2-19 21:08
按照我对printf的认识,printf函数是会缓存输出的,直到缓存满或碰到换行符才会真正输出。 ...
从输出速度来看,确实不是每次都输出(printf和USART_SendData的效果一样),怎样才能每写一个字符输出一次呢? zoomdy 发表于 2017-2-19 21:04
是压根没收到数据呢?还是接收到的数据长度不对?还是接收的数据不匹配? ...
收到了数据,但是与发送的不一致。比如发送字符a,得到的数据以十六进制显示为1C 00 FC,令人不解
页:
[1]
2