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

2019-07-21 03:32发布

之前一直用的是
[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

后来我自己捣鼓了一下


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







友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
zzj
1楼-- · 2019-07-22 12:38
学习学习。。。
ghostfly
2楼-- · 2019-07-22 16:27
 精彩回答 2  元偷偷看……
ghostfly
3楼-- · 2019-07-22 18:45
就是只要开启USART_ITConfig(USART2, USART_IT_TC, ENABLE);   它就会自己自动进中断,但是我开启USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);就不会自动进中断,求解释
罗飞
4楼-- · 2019-07-22 20:09
回复【16楼】ghostfly:
---------------------------------
你一个是发送中断,一个是接收中断
ghostfly
5楼-- · 2019-07-22 21:26
楼主,有空帮我看下这个程序,它会自动发送第一次数据,我不是为什么?  这是链接http://pan.baidu.com/s/1o6kMOtW
麻烦了

一周热门 更多>