完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
下面是STM32f411的串口数据发送代码,上位机通过串口调试助手进行接收,始终无法得到正确的数据,请大神们帮忙看一下:
#include #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!"); } |
|
相关推荐
15个回答
|
|
第一次发帖,大神们看过来
|
|
|
|
是压根没收到数据呢?还是接收到的数据长度不对?还是接收的数据不匹配?
|
|
|
|
你这个程序连上仿真器在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); } |
|
|
|
从输出速度来看,确实不是每次都输出(printf和USART_SendData的效果一样),怎样才能每写一个字符输出一次呢? |
|
|
|
收到了数据,但是与发送的不一致。比如发送字符a,得到的数据以十六进制显示为1C 00 FC,令人不解 |
|
|
|
感觉串口设置还缺点啥
|
|
|
|
重定向函数也去掉了,让程序重复输出`a`,结果在串口调试助手上接收到的十六进制数是1C 00 FC
|
|
|
|
波特率没搞对? |
|
|
|
代码中的波特率和串口助手中的是一致的,9600和115200都试过了。
|
|
|
|
我用的是stm32f411,感觉这个型号的片子有什么特殊之处。
|
|
|
|
经过一段时间的努力,终于找到了问题的原因,在于外部时钟的频率与默认值不一致所致,修改一下外部时钟的宏定义就可以了。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
765 浏览 1 评论
1003 浏览 1 评论
1960 浏览 1 评论
1689 浏览 1 评论
MCU友好过渡MPU,米尔基于STM32MP135开发板裸机开发应用笔记
700 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-5-16 07:20 , Processed in 1.046279 second(s), Total 123, Slave 106 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号