OpenEdv-开源电子网

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

无DMA下的串口发送问题(小经验)

[复制链接]

1

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2015-2-15
在线时间
17 小时
发表于 2015-3-9 16:08:11 | 显示全部楼层 |阅读模式
之前一直用的是
[mw_shl_code=c,true]USART_SendData(USART1,0x06); while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); [/mw_shl_code]
这种发送方式,然后发送多个字节的时候,就在外面加一个while,或者for。但是后来发现,这种写法经常会出现问题,
在中断比较多的时候,会出现程序死机的现象。还有就是这样的发送,如果发送很长的数据,就会占用很长的时间。
在我做项目的时候,纠结的要死。

后来我的老师提供了一种方法,现在来分享下!!希望对大家有用!!


首先,我们打开串口发送中断(谢谢提醒,开发送中断是这个函数 USART_ITConfig(USART1,USART_IT_TC,ENABLE);),  
//对应的请标志的USART_ClearITPendingBit(USART1,USART_IT_TC);

当我们需要发送数据时:
先发送一个字节,
这时候程序会进入中断,
清发送中断的标志,
在中断里发送第二个字节的数据。

由于第二个字节的数据发送完成以后,没有清除中断标志,所以在出中断以后,由于中断的标志还在,所以再一次进中断。
这样的话,就可以在中断发送完成剩下的数据了。
下面把程序中断部分的代码贴一下。

Usart_Data_Len表示要发送的数据的长度
简单的就是这样了,但这样发送有一个问题,比如
aa  32   34  54  56  24   23
用这种发送方法之后就会变成这样
aa 23 24 56 54 34 32


后来我自己捣鼓了一下



这样就可以顺序的发送数据啦。。。。。







奋斗吧,小鸟
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

5

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-8-16
在线时间
34 小时
发表于 2015-3-10 09:20:48 | 显示全部楼层
1—是否开启串口发送中断:USART_ITConfig(USART1,USART_IT_TXE,ENABLE) ?
2—楼主是否可以把中断里面的程度都贴出来?
3—谢谢
回复 支持 反对

使用道具 举报

1

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2015-2-15
在线时间
17 小时
 楼主| 发表于 2015-3-10 10:01:59 | 显示全部楼层

奋斗吧,小鸟
回复 支持 反对

使用道具 举报

1

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2015-2-15
在线时间
17 小时
 楼主| 发表于 2015-3-10 10:02:54 | 显示全部楼层
回复【3楼】ghostfly:
---------------------------------
关于开发送中断的地方错了。。。。现在已经改正
奋斗吧,小鸟
回复 支持 反对

使用道具 举报

5

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-8-16
在线时间
34 小时
发表于 2015-3-10 11:20:15 | 显示全部楼层
1— 楼主,开启发送中断后,每次调用USART_SendData函数发送完一个字节后产生中断,然后进中断,是这样顺序吗?
2— 在中断里面发送第二个字节时,是在发送完成后就马上再次进入中断,还是在发送完成后退出当前中断后再次进入中断?
3—谢谢
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2014-6-22
在线时间
3 小时
发表于 2015-3-10 14:09:23 | 显示全部楼层
最近在写usart,刚好试试这个,谢谢分享
回复 支持 反对

使用道具 举报

5

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-8-16
在线时间
34 小时
发表于 2015-3-10 14:14:39 | 显示全部楼层
1— USART_ITConfig(USART1, USART_IT_TC, ENABLE); //调用USART_SendData函数发送完一个字节后产生中断
2— 发送完第二字节后,退出当前中断,再次进中断。每次清的是上次发送数据的中断

3—我觉得在发送字节未完成未产生USART1_IRQHandler中断时,还是有可能被其他更高优先级的中断打断,楼主你的意见呢?
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2015-2-5
在线时间
31 小时
发表于 2015-3-10 15:38:30 | 显示全部楼层
那为什么不用DMA了
回复 支持 反对

使用道具 举报

1

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2015-2-15
在线时间
17 小时
 楼主| 发表于 2015-3-10 18:23:42 | 显示全部楼层
回复【9楼】alficfte:
---------------------------------
因为这个东东可以用在别的地方!!所以我才分享的
奋斗吧,小鸟
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2015-2-5
在线时间
31 小时
发表于 2015-3-11 11:01:27 | 显示全部楼层
回复【10楼】罗飞:
--------------------------------那谢谢分享了  学习了
回复 支持 反对

使用道具 举报

1

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2015-2-15
在线时间
17 小时
 楼主| 发表于 2015-3-11 15:01:59 | 显示全部楼层
回复【8楼】ghostfly:
---------------------------------
1.中断打断了,标志还在,继续跑。
2.出中断再进中断
奋斗吧,小鸟
回复 支持 反对

使用道具 举报

6

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2015-3-12
在线时间
2 小时
发表于 2015-3-13 08:40:57 | 显示全部楼层
竟然和我的程度相似度99%………
回复 支持 反对

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2015-3-13 14:27:53 | 显示全部楼层
学习学习。。。
回复 支持 反对

使用道具 举报

5

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-8-16
在线时间
34 小时
发表于 2015-4-2 11:31:28 | 显示全部楼层
楼主,为什么我用了你的办法串口一直在发送数据?
回复 支持 反对

使用道具 举报

5

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-8-16
在线时间
34 小时
发表于 2015-4-2 12:53:37 | 显示全部楼层
就是只要开启USART_ITConfig(USART2, USART_IT_TC, ENABLE);   它就会自己自动进中断,但是我开启USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);就不会自动进中断,求解释
回复 支持 反对

使用道具 举报

1

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2015-2-15
在线时间
17 小时
 楼主| 发表于 2015-4-2 14:37:55 | 显示全部楼层
回复【16楼】ghostfly:
---------------------------------
你一个是发送中断,一个是接收中断
奋斗吧,小鸟
回复 支持 反对

使用道具 举报

5

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-8-16
在线时间
34 小时
发表于 2015-4-2 15:57:41 | 显示全部楼层
楼主,有空帮我看下这个程序,它会自动发送第一次数据,我不是为什么?  这是链接http://pan.baidu.com/s/1o6kMOtW
麻烦了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 08:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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