无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条回答
ghostfly
1楼-- · 2019-07-22 00:18
1— USART_ITConfig(USART1, USART_IT_TC, ENABLE); //调用USART_SendData函数发送完一个字节后产生中断
2— 发送完第二字节后,退出当前中断,再次进中断。每次清的是上次发送数据的中断

3—我觉得在发送字节未完成未产生USART1_IRQHandler中断时,还是有可能被其他更高优先级的中断打断,楼主你的意见呢?
alficfte
2楼-- · 2019-07-22 01:29
那为什么不用DMA了
罗飞
3楼-- · 2019-07-22 03:19
回复【9楼】alficfte:
---------------------------------
因为这个东东可以用在别的地方!!所以我才分享的
alficfte
4楼-- · 2019-07-22 04:02
 精彩回答 2  元偷偷看……
罗飞
5楼-- · 2019-07-22 08:43
回复【8楼】ghostfly:
---------------------------------
1.中断打断了,标志还在,继续跑。
2.出中断再进中断
shurongcheung
6楼-- · 2019-07-22 09:53
竟然和我的程度相似度99%………

一周热门 更多>