OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4977|回复: 9

串口收发数据存在问题?

[复制链接]

28

主题

91

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2132
金钱
2132
注册时间
2014-11-18
在线时间
215 小时
发表于 2014-12-28 00:25:16 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]#include"stm32f10x.h" #define RX_SIZE 4 u8 RecvBuf[RX_SIZE]; u8 RecvFlag=1; //重新配置系统时钟 void Select_HSEforSysclk() { RCC_DeInit(); //将外设RCC寄存器重新设置为缺省值 RCC_HSEConfig(RCC_HSE_ON); //选择外部高速时钟 while(RCC_WaitForHSEStartUp()!=SUCCESS);//等待外部高速时钟稳定 RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB时钟为系统时钟 RCC_PCLK1Config(RCC_SYSCLK_Div2); //设置APB1时钟为=Div2 RCC_PCLK2Config(RCC_SYSCLK_Div1); //设置APB2时钟为=Div1; RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//设置HSE为PLL的输入,选择9倍频 RCC_PLLCmd(ENABLE); //使能PLL while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)!=SET);//等待PLL就绪 FLASH_SetLatency(FLASH_Latency_2); //FLASH延时两个周期 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置PLL作为系统时钟 while(RCC_GetSYSCLKSource()!=0x08); //判断PLL是否为系统时钟 } void usart1_init() { GPIO_InitTypeDef GPIO_InitStructure;//定义结构体类型的变量,必须放在最前面 USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //PA9为TXD,PA10为RXD GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_Init(GPIOA,&GPIO_InitStructure); //中断配置 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //115200,8个数据位,1个停止位,无校验位,无流控制,收发模式 USART_DeInit(USART1); USART_InitStructure.USART_BaudRate=115200; USART_InitStructure.USART_WordLength=USART_WordLength_8b; USART_InitStructure.USART_StopBits=USART_StopBits_1; USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; USART_InitStructure.USART_Parity=USART_Parity_No; USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//串口1接收中断 USART_Init(USART1,&USART_InitStructure); //初始化串口1 USART_Cmd(USART1,ENABLE); //使能串口1 } void USART1_IRQHandler(void) //串口1中断服务程序 { u8 i=0; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { RecvBuf[i++]=USART_ReceiveData(USART1); //(USART1->DR); //读取电脑发送的命令 if (i >=RX_SIZE) { i = 0; RecvFlag = 1; //接收完成,标志置1 } } } int main(void) { u8 i=0; Select_HSEforSysclk(); usart1_init(); while(1) { i=0; if(RecvFlag==1) { while (i <= RX_SIZE) { USART_SendData(USART1,RecvBuf[i++]+1); while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET); } RecvFlag=0;//发送完成置0; } USART_SendData(USART1,'1'); } } [/mw_shl_code]
不知道问题出现在哪里了?通过串口发送后,收不到是哪里的问题?

最佳答案

查看完整内容[请看2#楼]

仿真+对比。 问题就找到了。 仿真我们例程,和你自己这个,看寄存器配置,有什么区别?自然问题就找到了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-28 00:25:17 | 显示全部楼层
仿真+对比。
问题就找到了。

仿真我们例程,和你自己这个,看寄存器配置,有什么区别?自然问题就找到了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

16

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1292
金钱
1292
注册时间
2014-12-20
在线时间
534 小时
发表于 2014-12-28 09:43:44 | 显示全部楼层
中断优先级分组没配置会不会有问题?
回复

使用道具 举报

28

主题

91

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2132
金钱
2132
注册时间
2014-11-18
在线时间
215 小时
 楼主| 发表于 2014-12-28 11:47:26 | 显示全部楼层
回复【2楼】BMN李:
---------------------------------
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3  

044     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;      //子优先级
回复

使用道具 举报

16

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1292
金钱
1292
注册时间
2014-12-20
在线时间
534 小时
发表于 2014-12-28 12:28:59 | 显示全部楼层
回复【3楼】freeelectron:
---------------------------------
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
回复

使用道具 举报

28

主题

91

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2132
金钱
2132
注册时间
2014-11-18
在线时间
215 小时
 楼主| 发表于 2014-12-28 16:20:31 | 显示全部楼层
回复【4楼】BMN李:
---------------------------------
这一句话添加进还是不行啊
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11559
金钱
11559
注册时间
2014-4-1
在线时间
1318 小时
发表于 2014-12-28 17:55:15 | 显示全部楼层
Tx 和 Rx 端必须配置为AF模式,而且必须是UART功能。
PA10只作为一般的数字输入,这不对。

回复

使用道具 举报

28

主题

91

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2132
金钱
2132
注册时间
2014-11-18
在线时间
215 小时
 楼主| 发表于 2014-12-28 18:29:10 | 显示全部楼层
回复【6楼】xuande:
---------------------------------
这个配置我是仿照原子的例程写的!
回复

使用道具 举报

28

主题

91

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2132
金钱
2132
注册时间
2014-11-18
在线时间
215 小时
 楼主| 发表于 2014-12-28 23:12:35 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
原子大哥啊,这个问题我纠结了好几天了,实在是看不出问题出在哪里了?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-30 00:00:11 | 显示全部楼层
回复【9楼】freeelectron:
---------------------------------
都说了让你仿真对比看。
你仿真了么?
对比了么?
寄存器配置一样么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-27 11:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表