OpenEdv-开源电子网

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

STM32F051使用串口中断接收只能接收到第一位数据,后面的都收不到

[复制链接]

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2014-11-4
在线时间
4 小时
发表于 2014-11-4 11:08:34 | 显示全部楼层 |阅读模式
5金钱
使用STM32F051的串口2调试模块, MCU只接收到第一位数据,后面的7位数据都接收不到,请问改如何解决?
描述:
1、我使用串口调试助手测试MCU的程序,用MCU发送指令0xF5, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xF5
然后用助手发送正确的返回指令0xF5,0x0D, 0x00, 0x01, 0x00, 0x00, 0x0C, 0xF5
程序完全没有问题,全部都能接收能发送,并且我发错误指令时程序也能判断出错误,但是我连接上模块时,
程序出错了,程序一进接收中断就跑死,后来看了网上的大神解析改正过来,现在进入接收中断不会死了,但是又出现了新的问题

2、程序只能接收第一个数据 0XF5 后面的7位都不能接收,直接就接收超时了(我程序设定了1Sec 接收超时报警),我仿真了下,看到只能接收到一个数据
但是我用串口线把MCU的数据发送和模块的数据反馈打印到串口调试助手,发现,命令是正确的,模块也识别命令了,返回了正确的答复数据,说明指令的发送是没有错误的,是我程序的问题,但是我非常奇怪用串口调试助手调试时程序没有问题,连上模块就只能接收到第一个数据了。

串口初始化和中断接收的程序如下:

串口2初始化
[mw_shl_code=c,true]void USART2_Init(void)//串口2初始化函数 { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE ); GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_1); GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_1); /* * USART2_TX -> PA2 , USART2_RX -> PA3 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 57600;//设置串口波特率 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_Rx | USART_Mode_Tx;//设置工作模式 USART_Init(USART2, &USART_InitStructure); //配置入结构体 NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;      NVIC_InitStructure.NVIC_IRQChannelPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_Cmd(USART2, ENABLE);//使能串口2 USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);[/mw_shl_code] [mw_shl_code=c,true] //下面这两句是网上大神说要这样添加的 USART_ITConfig(USART2, USART_IT_PE, ENABLE); USART_ITConfig(USART2, USART_IT_ERR, ENABLE); }[/mw_shl_code]
串口中断

[mw_shl_code=c,true]void USART2_IRQHandler(void) { uint8_t Clear_ch = 0;   //读一下寄存器,实际没有用到 if(USART_GetITStatus(USART2, USART_IT_TXE) == SET)    //发送 { USART_SendData(USART2, send_num[a++]); Delay_ms(10); if(a == 8) { a = 0; b = 0; Flag = 0; USART_ITConfig(USART2, USART_IT_TXE, DISABLE); USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); } } if(USART_GetITStatus(USART2, USART_IT_RXNE) == SET)    //接收 { USART_ClearITPendingBit(USART2, USART_IT_RXNE); rec_num[b++]=USART_ReceiveData(USART2); Flag = 1; } //下面这部分是看了网上的大神说这样添加的,添加后进入接收中断就没有跑死了 if(USART_GetFlagStatus(USART2,USART_FLAG_ORE)==SET) { USART_ClearFlag(USART2,USART_FLAG_ORE); //读SR Clear_ch = USART_ReceiveData(USART2); //读DR Flag = 1; } if(USART_GetFlagStatus(USART2, USART_FLAG_NE) == SET) { USART_ClearFlag(USART2, USART_FLAG_NE); Flag = 1; } if(USART_GetFlagStatus(USART2, USART_FLAG_FE) == SET) { USART_ClearFlag(USART2, USART_FLAG_FE); Flag = 1; } if(USART_GetFlagStatus(USART2, USART_FLAG_PE) == SET) { USART_ClearFlag(USART2, USART_FLAG_PE); Flag = 1; } Clear_ch = Clear_ch+0; }[/mw_shl_code]
现在这个程序 [mw_shl_code=c,true]rec_num[]缓存中只有rec_num[0]接收到0XF5,后面的7位接收不到了。[/mw_shl_code] [mw_shl_code=c,true]运行平台如下:[/mw_shl_code] [mw_shl_code=c,true]STM32F051C8T6 内部8MHz晶振 系统时钟48MHz 通信波特率 57600[/mw_shl_code] [mw_shl_code=c,true]再说一下问题吧,MCU与串口调试助手对发与接收时,程序没有问题 。MCU与模块发送接收时MCU只能接收第一位数据,后面的7位接收不到,为什么?请大神帮帮忙。[/mw_shl_code]

最佳答案

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

终于都知道原因了,原来是模块的反应速度比串口调试助手快,只要把发送的最后一次的延时去掉就可以了,谢谢大家的帮忙
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2014-11-4
在线时间
4 小时
 楼主| 发表于 2014-11-4 11:08:35 | 显示全部楼层
终于都知道原因了,原来是模块的反应速度比串口调试助手快,只要把发送的最后一次的延时去掉就可以了,谢谢大家的帮忙
回复

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2014-11-4
在线时间
4 小时
 楼主| 发表于 2014-11-4 11:55:16 | 显示全部楼层
请大神指点一下
回复

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2014-11-4
在线时间
4 小时
 楼主| 发表于 2014-11-4 14:15:10 | 显示全部楼层
是问题没有说清楚还是什么?好像没有人回答
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2014-11-4 17:30:18 | 显示全部楼层
帮顶一下,你等高手来吧
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-4 23:09:26 | 显示全部楼层
帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2014-11-4
在线时间
4 小时
 楼主| 发表于 2014-11-5 08:25:06 | 显示全部楼层
好像没有人遇到过这种情况。。。。。。。。。。。。
回复

使用道具 举报

0

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
167
金钱
167
注册时间
2014-6-6
在线时间
22 小时
发表于 2014-11-5 13:12:23 | 显示全部楼层
帮顶!

实验十:usart串口.zip

1.29 MB, 下载次数: 2662

回复

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2014-11-4
在线时间
4 小时
 楼主| 发表于 2014-11-6 10:45:38 | 显示全部楼层
回复【7楼】纯属患觉:
---------------------------------
谢谢,这个程序我也有,不过悲催的是MCU跟串口调试助手互调是可以的,模块跟串口调试助手也是可以的,但MCU与模块互调只能接收到一个数据,后面的7位全部丢失了
回复

使用道具 举报

0

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
167
金钱
167
注册时间
2014-6-6
在线时间
22 小时
发表于 2014-11-7 17:30:09 | 显示全部楼层
回复【8楼】snyanglq:
---------------------------------
调试助手和模块可以通讯吗?
回复

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2014-11-4
在线时间
4 小时
 楼主| 发表于 2014-11-17 11:08:28 | 显示全部楼层
回复【9楼】纯属患觉:
---------------------------------
可以啊,这两个通信没有问题
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-17 19:59:12 | 显示全部楼层
帮顶....
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-26 21:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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