完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
用串口1进行通信,上位机用串口调试助手发送数据并进行接收,结果发现上位机接收到的数据少于上位机发送的数据,也就是STM32接收数据有丢失现象,请帮忙看一下代码哪里出了问题。
#include #include "main.h" void delay_ms(u16 time) { u16 i=0; while(time--) { i=12000; while(i--); } } //配置UART1接收中断 void NVIC_Configuration(void) { NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); // USART_ITConfig(USART1,USART_IT_TXE,ENABLE); //允许串口1发送中断。 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //允许串口1接收中断。 NVIC_InitTypeDef NVIC_InitStructure; /* Configure the NVIC Preemption Priority Bits */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); /* Enable the USARTy Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } 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; 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); //启动串口 USART_ClearFlag(USART1,USART_FLAG_TC); //发送完成标志位 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 打开中断 USART_ITConfig(USART1, USART_IT_ORE, ENABLE); } void USART1_IRQHandler(void) { uint8_t ch; if (USART_GetITStatus(USART1, USART_IT_ORE) == SET) { USART_ClearITPendingBit(USART1,USART_IT_ORE); USART_ReceiveData( USART1 ); } if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { USART_ClearFlag(USART1,USART_FLAG_RXNE); USART_ClearITPendingBit(USART1, USART_IT_RXNE); ch = USART1->DR; ch = USART_ReceiveData(USART1); //接受数据 USART_SendData(USART1,ch); while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } } int fputc(int ch,FILE *f) { // USART1->SR; USART_GetFlagStatus(USART1, USART_FLAG_TC);// 解决第一个字符发送失败的问题 //一个一个发送字符 USART_SendData(USART1, (unsigned char) ch); //等待发送完成 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET); return(ch); } int fgetc(FILE *f) { /* 等待串口1输入数据 */ while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); return (int)USART_ReceiveData(USART1); } int main(void) { NVIC_Configuration(); // USART1 config 9600 8-N-1 USART1_Config(); for(;;) { } } |
|
相关推荐
9个回答
|
|
把USART1_IRQHandler函数中的while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);去掉
|
|
|
|
这两行代码功能重复了吧
|
|
|
|
|
|
|
|
|
|
|
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; 不能这样吧,应设为TX是输出,而RX是浮空输入 |
|
|
|
换个软件试试
|
|
|
|
中断接收不要去发送数据,接收到一个缓冲区中,中断中发送肯定会影响。
|
|
|
|
代码写得有点乱。这么多热心朋友,替楼主赞下!
1、6楼指出的管脚配置的问题,你的管脚配置不完整。 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Pin = USARTx_TX_PIN; 。。。。 2、还有板凳指出的代码重复问题‘。 3、你检查下两边波特率是否一致;先可以把波特率放低点调试。 4、程序逻辑要你自己静心好好理下。官方有UART应用代码,你可以参考。 |
|
|
|
确实很感谢各位,各位提出的问题我一点点试,有了结果告诉大家。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
806 浏览 1 评论
842 浏览 0 评论
MCU友好过渡MPU,米尔基于STM32MP135开发板裸机开发应用笔记
614 浏览 0 评论
自定义系统时钟频率后,用库函数和微带两种方式点亮LED灯,为什么灯的闪烁频率不一致?
1428 浏览 2 评论
1644 浏览 2 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-4-20 11:50 , Processed in 0.642971 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号