OpenEdv-开源电子网

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

求助大神看看我的诊断串口中断处理程序,好像只能接收第一个字节,后面的字节不能接收

[复制链接]

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2014-10-27
在线时间
0 小时
发表于 2014-10-27 10:27:47 | 显示全部楼层 |阅读模式
5金钱
程序代码如下,只贴出串口配置函数和串口中断处理函数
[mw_shl_code=c,true]void USART1_Config(void) { USART_InitTypeDef USART_InitStructure; /* USART1 mode config */ 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_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //USART_ITConfig(USART1, USART_IT_TXE, ENABLE); USART_Cmd(USART1,ENABLE); //USART_ClearFlag(USART1, USART_FLAG_TC); } void USART1_ISR(void) { if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET) { USART_ClearFlag(USART1,USART_FLAG_RXNE); //USART_ClearITPendingBit(USART1,USART_IT_RXNE); USART1_Receive[USART1_RX]=USART_ReceiveData(USART1); USART1_RX++; USART1_RX&=0xFF; if(USART1_Receive[USART1_RX-1]==0x5A) //检测到帧头0x5A { printf("\r\n start \r\n"); USART1_TX=USART1_RX-1; } if((USART1_Receive[USART1_TX]==0x5A)&&(USART1_Receive[USART1_RX-1]==0xA5)) //检测到帧头的情况下检测到帧尾0xA5 { USART1_Len=USART1_RX-1-USART1_TX; printf("\r\n end \r\n"); USART1_Over=1; } }中断处理程序实现的功能为,接收到帧头0x5a的时候,向串口发送start,接收到帧尾0xa5的时候发送end,但用串口助手调试的时候,发现只发送了start,如下图所示。本人用arm的时间不长,求大神解惑。[/mw_shl_code] [mw_shl_code=c,true]

[/mw_shl_code]

最佳答案

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

回复【3楼】zhaopengdt: --------------------------------- 因为你中断占用太多时间了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-27 10:27:48 | 显示全部楼层
回复【3楼】zhaopengdt:
---------------------------------
因为你中断占用太多时间了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-10-27 12:43:57 | 显示全部楼层
中断服务函数是这样的么?void USART1_ISR(void)
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2014-10-27
在线时间
0 小时
 楼主| 发表于 2014-10-27 15:27:37 | 显示全部楼层
回复【2楼】Badu_Space:
---------------------------------
这个函数是作为中断函数的子函数的
void USART1_IRQHandler(void)
{
  USART1_ISR();
}
怪我没有说清楚,奇怪的是,我把printf("\r\n start \r\n")注释掉之后就可以接受所有数据了,还没找到是什么原因
回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2014-10-27
在线时间
0 小时
 楼主| 发表于 2014-10-27 17:17:34 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
求解释,为什么去掉第一个printf后,就能接受所有数据了呢
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2014-10-27
在线时间
0 小时
 楼主| 发表于 2014-10-27 19:54:43 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
看了一下资料,printf是把STDIO.h中fput.c重定向。
int fputc(int ch, FILE *f)
{
/* ??Printf????·??ù???? */
  USART_SendData(USART1, (unsigned char) ch);
  //while (!(USART1->SR & USART_FLAG_TXE));
  while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);
  return (ch);
}
它是怎么占时间的呢
回复

使用道具 举报

5

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-7-8
在线时间
6 小时
发表于 2014-10-27 20:06:30 | 显示全部楼层
你printf在中断里占时间了
QQ:909428831
回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2014-10-27
在线时间
0 小时
 楼主| 发表于 2014-10-27 20:53:46 | 显示全部楼层
回复【8楼】迷糊789:
---------------------------------
请问是怎么占时间的,占时间了具体是怎么影响后续数据的接受呢,求解惑
回复

使用道具 举报

9

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2012-2-16
在线时间
11 小时
发表于 2014-10-27 21:48:05 | 显示全部楼层
回复【9楼】zhaopengdt:
---------------------------------
你自己做下测试就知道打印函数printf到底占用多长时间了!
方式如下
配置一个闲置的GPIO输出低电平
修改ISR函数如下,示波器抓GPIO的高电平持续时间
if(USART1_Receive[USART1_RX-1]==0x5A)  //检测到帧头0x5A
31
        {
32         GPIO输出高电平
            printf("\r\n start \r\n");

33        GPIO输出低电平
            USART1_TX=USART1_RX-1;
34
        }


楼主要是有时间测试,请回来回复测试结果~~~~~~~~~
回复

使用道具 举报

9

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2012-2-16
在线时间
11 小时
发表于 2014-10-27 21:53:23 | 显示全部楼层
回复【9楼】zhaopengdt:
---------------------------------
还有一个小的建议
打印函数也是使用的USART1,不知道和你的USART1是否有冲突
建议楼主修改一下自己的程序用USART2,或者修改打印函数为USART2
总之这两个函数用不同的USART
测试一下吧~~~
记得回来回复结果~~
实践出真知~~~~~
回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2014-10-27
在线时间
0 小时
 楼主| 发表于 2014-10-28 12:37:51 | 显示全部楼层
回复【11楼】tuzihog:
---------------------------------
好的,最近忙着项目结果,先把程序调出来,之后有时间再按你的思路做做尝试
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-30 06:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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