OpenEdv-开源电子网

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

关于串口实验中断服务程序的问题

[复制链接]

2

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2014-11-30
在线时间
1 小时
发表于 2014-11-30 17:19:13 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]小弟在串口通信实验中遇到了问题 发现串口能正常发送数据但不能接收[/mw_shl_code] [mw_shl_code=c,true]各种测试后发现是中断服务程序中有问题 但一直找不出问题在哪 求助各位大大[/mw_shl_code] [mw_shl_code=c,true]void USART1_IRQHandler( void )[/mw_shl_code] [mw_shl_code=c,true]{ if ( USART_GetITStatus( USART1 , USART_FLAG_RXNE != RESET ) ) { USART_ClearITPendingBit( USART1 , USART_FLAG_RXNE ); if ( (USART1_Rx_Sta & 0x8000) == 0 ) { RevByte = USART_ReceiveData( USART1 ); if ( (USART1_Rx_Sta & 0x4000) !=0 ) { if ( RevByte == 0x0a ) { USART1_Rx_Sta |= 0x8000; } else { USART1_Rx_Sta = 0; printf("接收错误\r\n"); } } else { if ( RevByte == 0x0d ) { USART1_Rx_Sta |= 0x4000; } else { RevBuffer[USART1_Rx_Sta&0x3fff] = RevByte; USART1_Rx_Sta ++; if ( USART1_Rx_Sta >= USART1_MAX_BUFFER_LEN ) { USART1_Rx_Sta = 0; printf("超过最大接收长度\r\n"); } } } } } }[/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code]

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2014-4-6
在线时间
46 小时
发表于 2014-11-30 20:46:44 | 显示全部楼层
个人认为可能是if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)这个问题,USART_IT_RXNE是中断标志,而你的是USART_FLAG_RXNE事件标志
回复

使用道具 举报

20

主题

232

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
金钱
335
注册时间
2013-6-1
在线时间
0 小时
发表于 2014-12-1 08:47:10 | 显示全部楼层
楼上正解,你用这个USART_FLAG_RXNE来判断是否进入中断,应该使用USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);这个库函数
回复

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2014-11-30
在线时间
1 小时
 楼主| 发表于 2014-12-1 13:29:28 | 显示全部楼层
先谢谢楼上两位的回答 但是我又重新试了下
无论是改成 if ( USART_GetITStatus( USART1 , USART_IT_RXNE != RESET ) )
{
USART_ClearITPendingBit( USART1 , USART_IT_RXNE );
                ....

还是改成if ( USART_GetFlagStatus( USART1 , USART_FLAG_RXNE != RESET ) )
{
USART_ClearFlag( USART1 , USART_FLAG_RXNE );
                ....
都不能正常工作。。
回复

使用道具 举报

20

主题

232

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
金钱
335
注册时间
2013-6-1
在线时间
0 小时
发表于 2014-12-2 09:56:50 | 显示全部楼层
回复【4楼】kksxf:
---------------------------------
这句设置断点,确定是否进入了中断
回复

使用道具 举报

12

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2014-4-6
在线时间
46 小时
发表于 2014-12-2 10:13:23 | 显示全部楼层
回复【4楼】kksxf:
---------------------------------
你参考一下原子提供的串口代码,看看有什么不同
回复

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2014-11-30
在线时间
1 小时
 楼主| 发表于 2014-12-2 10:53:04 | 显示全部楼层
回复【5楼】Scy:
---------------------------------
可以进入中断
回复

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2014-11-30
在线时间
1 小时
 楼主| 发表于 2014-12-2 10:54:19 | 显示全部楼层
回复【6楼】Electfans:
---------------------------------
看不出有什么不同的地方。。但就是用例程可以。。我自己写的就不可以
回复

使用道具 举报

12

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2014-4-6
在线时间
46 小时
发表于 2014-12-2 11:04:03 | 显示全部楼层
回复【8楼】kksxf:
---------------------------------
上传一下你写的,我帮你看一下
回复

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2014-11-30
在线时间
1 小时
 楼主| 发表于 2014-12-2 11:09:17 | 显示全部楼层
[mw_shl_code=c,true]void USART1_IRQHandler( void ) { GPIO_ResetBits( GPIOB , GPIO_Pin_5 ); if ( USART_GetFlagStatus( USART1 , USART_FLAG_RXNE != RESET ) ) { USART_ClearFlag( USART1 , USART_FLAG_RXNE ); if ( (USART1_Rx_Sta & 0x8000) == 0 ) { RevByte = USART_ReceiveData( USART1 ); if ( (USART1_Rx_Sta & 0x4000) !=0 ) { if ( RevByte == 0x0a ) { USART1_Rx_Sta |= 0x8000; } else { USART1_Rx_Sta = 0; printf("接收错误\r\n"); } } else { if ( RevByte == 0x0d ) { USART1_Rx_Sta |= 0x4000; } else { RevBuffer[USART1_Rx_Sta&0x3fff] = RevByte; USART1_Rx_Sta ++; if ( USART1_Rx_Sta >= USART1_MAX_BUFFER_LEN ) { USART1_Rx_Sta = 0; printf("消息过长\r\n"); } } } } } }[/mw_shl_code]

回复

使用道具 举报

12

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2014-4-6
在线时间
46 小时
发表于 2014-12-2 11:12:29 | 显示全部楼层
能不能上传整个工程
回复

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2014-11-30
在线时间
1 小时
 楼主| 发表于 2014-12-2 11:22:13 | 显示全部楼层
哦。。就是我是实验一个接着一个做在同一个工程里的。。可能有点乱

exp.zip

6.36 MB, 下载次数: 81

回复

使用道具 举报

12

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2014-4-6
在线时间
46 小时
发表于 2014-12-2 12:32:50 | 显示全部楼层


你的判断条件是如果串口1接收完数据,就执行以下的操作(打印“所发送的是”和发送你接收的数据(RevBuffer【】)),我试过都能有上述的现象,就证明了你的串口1接收没问题,你是不是对串口的接收有误解
回复

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2014-11-30
在线时间
1 小时
 楼主| 发表于 2014-12-2 14:32:22 | 显示全部楼层
回复【13楼】Electfans:
---------------------------------
是这样的。。我把例程中的中断服务程序直接放到我的工程里了。。把我自己写的中断服务程序注释掉了。。需要重新传一个吗?
回复

使用道具 举报

12

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2014-4-6
在线时间
46 小时
发表于 2014-12-2 14:48:50 | 显示全部楼层
回复【14楼】kksxf:
---------------------------------
你的QQ是
回复

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2014-11-30
在线时间
1 小时
 楼主| 发表于 2014-12-2 14:51:36 | 显示全部楼层
回复【15楼】Electfans:
---------------------------------
526874257
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 12:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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