OpenEdv-开源电子网

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

关于串口中断接收的问题

[复制链接]

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2011-6-25
在线时间
1 小时
发表于 2012-9-11 23:23:43 | 显示全部楼层 |阅读模式
请教一下各位大虾,为什么在USART1的发送为中断模式的时候,接收数据时只会接收第一个数据啊,附件是我的程序,接收例程拷贝的原子哥的,发送函数为cout(),自己写的,跪求给点意见。

USART_RS_C.rar

375.46 KB, 下载次数: 1594

需要学得东西太多
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2011-6-25
在线时间
1 小时
 楼主| 发表于 2012-9-11 23:51:15 | 显示全部楼层
补充一下,当发送一串字符串的时候,只能接受第一个字符,后边的全丢了,本以为是发生什么特殊中断引起的,可是我看了看运行原子哥的例程和自己写的函数时,寄存器状态位的差异,都一样的,我完全找不到原因,也不知道从何下手,请各位大虾给些意见
需要学得东西太多
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-9-12 00:09:33 | 显示全部楼层
可有JTAG跟踪过?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2011-6-25
在线时间
1 小时
 楼主| 发表于 2012-9-12 20:26:52 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
跟踪过,就是在跟踪的时候发现中断是可以发生的,只不过在第一次中断后,后边的数据就都丢了
需要学得东西太多
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-9-12 21:06:08 | 显示全部楼层
丢失的原因是无法再次进入中断?还是没能进入中断?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2011-6-25
在线时间
1 小时
 楼主| 发表于 2012-9-13 00:23:04 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
中断可以进入,是不能再次进入。发送的字符串时只能接收第一个字符,当再次发送一串字符串时,还是只能接收第一个字符。这两次接收都进入了中断。我之前怀疑过是由于发送中断引起的,但是我在中断响应时先判断的接收,再判断的发送,应该能避免这样的问题发生,这中间的时间差应该很短,不会对接收造成影响吧!
需要学得东西太多
回复 支持 反对

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2011-6-25
在线时间
1 小时
 楼主| 发表于 2012-9-13 00:28:27 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
原子哥再顺便问一句,之前我看过你对别人的建议是串口发送不推荐用发送中断,是为什么啊?是这个原因么?
需要学得东西太多
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-9-13 00:32:00 | 显示全部楼层
麻烦.
回复 支持 反对

使用道具 举报

4

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
288
金钱
288
注册时间
2012-9-13
在线时间
65 小时
发表于 2012-9-13 09:45:25 | 显示全部楼层
回复【楼主位】竹叶青:
---------------------------------
暂时发现两个不合理的地方:
1、中断程序中未对中断标志清零;
2、函数cout与中断函数中的发送部分重复了,难道你发出来的数据是对的?
回复 支持 反对

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2011-6-25
在线时间
1 小时
 楼主| 发表于 2012-9-13 19:11:34 | 显示全部楼层
回复【9楼】Ihavedone:
---------------------------------
哦!是这样的:
1、中断服务程序中对发送中断的清除语句为 USART1->SR &= (~(1<<6));
     对接收中断的清除语句为           res=USART1->DR;
2、在cout函数中
USART1->DR = send_dat[uart_cnt++];//启动发送
这句代码只是启动发送,只会执行一次,没有循环,下一个字符的发送在中断服务程序中,最后判断字符串发送完毕由
while(uart_cnt); //等待发送完毕
这句代码实现。
我发送代码运行是正确的,你可以把我的代码下到板子中验证一下。
需要学得东西太多
回复 支持 反对

使用道具 举报

4

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
288
金钱
288
注册时间
2012-9-13
在线时间
65 小时
发表于 2012-9-14 16:03:01 | 显示全部楼层
根据你的描述,你说每次只能接受一串字符的第一个,你断点是不是打在中断里?如果断点在中断里,那就只能第一次进入,然后后面的数据全部发完了,但是因为你程序停下来了,你收不到。至于其他的,我没有板子,只看了代码,暂时还没发现程序有什么问题。
回复 支持 反对

使用道具 举报

15

主题

79

帖子

0

精华

初级会员

Rank: 2

积分
167
金钱
167
注册时间
2012-8-7
在线时间
7 小时
发表于 2012-9-14 21:57:07 | 显示全部楼层
 
楼主是串口的485调试么???

要是485通信的程序的话,如果采用中断接收,那么要在空闲状态下将485置为接收状态,即控制端要置低。。。。。

我前一阵子调串口的485遇到了同样的问题。。。

希望能够帮到你。。。
【好好学习天天向上】
回复 支持 反对

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2011-6-25
在线时间
1 小时
 楼主| 发表于 2012-9-14 22:28:29 | 显示全部楼层
回复【11楼】Ihavedone:
---------------------------------
我连续运行过,只有发了n次以后才会有反应,而且是乱码;而且我写了一个比较简短的测试程序,在接收到后边字符时进行判断,我的断点就打在这,这时候会一直没有执行
需要学得东西太多
回复 支持 反对

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2011-6-25
在线时间
1 小时
 楼主| 发表于 2012-9-14 22:29:27 | 显示全部楼层
回复【12楼】yougen1314:
---------------------------------
我就是用的USB转串口,不是485。谢谢你提供的经验。
需要学得东西太多
回复 支持 反对

使用道具 举报

4

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
288
金钱
288
注册时间
2012-9-13
在线时间
65 小时
发表于 2012-9-17 12:00:02 | 显示全部楼层
经过跟踪调试,发现程序有以下问题:
1、全局变量cnt在接收中断和定时中断中都修改了,这样当串口未收到数据时,是向外输出提示信息。但如果我向内部发送数据(暂不以0D0A结尾),则会造成输出提示信息的时间间隔紊乱。
2、若向串口输入以0D0A结尾的字符串,则在字符串完全输入时,USART_Rcvr的最高位置位,从而进入以下代码:
                if(USART_Rcvr & 0x80)
{    
len=USART_Rcvr&0x3f;//得到此次接收到的数据长度
cout("\n您发送的消息为:\n");
for(t=0;t<len;t++)
{
USART1->DR=USART_RcvDat[t];
while((USART1->SR&0X40)==0);//等待发送结束
}
cout("\n\n");//插入换行
USART_Rcvr=0;
}
在此段代码的for循环中,你采用了查询等待的方式,但因为此时串口发送中断开启,在USART1->DR=USART_RcvDat[t];发送第一个字节完成时,则进入发送中断,在中断中将发送完成标志位TC清空了,所以接下来的while((USART1->SR&0X40)==0);将永远等不到TC置位,程序执行到此处时进入死循环。
回复 支持 反对

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2011-6-25
在线时间
1 小时
 楼主| 发表于 2012-9-17 20:55:23 | 显示全部楼层
回复【15楼】Ihavedone:
---------------------------------
谢谢了,找到原因了,我的程序有好几个错误,首先你说的是一个错误
还有一个错误如下
USART1->CR1 |= 1<<2;//使能RE中断,允许接收
没有使能接收中断(虽然注释了),应该在或上1<<5才行。
再次感谢!
需要学得东西太多
回复 支持 反对

使用道具 举报

7

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2014-7-24
在线时间
1 小时
发表于 2015-4-14 09:40:01 | 显示全部楼层
回复【16楼】竹叶青:
---------------------------------
您好!我也遇到一个相似的问题,能帮我诊断诊断吗?谢谢!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 16:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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