【待续,啊啊啊啊】【找了一遍,最后成功!!】stm32 USART 防止发送缓冲区被新来的数据覆盖
来源:互联网 发布:识别文字的软件 编辑:程序博客网 时间:2024/03/28 19:57
除了发送数据后延时,我在尝试有没有其他办法。果然有!!
最后结论是(6),以下列出的是其他失败的尝试。
尝试办法:
1.【走不通】空闲符号 见我的文章http://blog.csdn.net/ysmz4/article/details/46546761
2.【走不通】断开符号 见我的文章http://blog.csdn.net/ysmz4/article/details/46546761
3.发送后延时波特时钟,会不会已经避免了此问题。
看半双工通信协议==============
4.【走不通】USART_SetGuardTime(USARTx, timevalue);//保护时间值 (Guard time value)
但是这是在智能卡模式下的,不能单独设置。(单独设置没有效果)
5.【听说太麻烦】硬件流控(CTS,RTS)
需要串口DB9的硬件连线+软件控制。详见我的文章《串口硬件流量控制说明》
6. 利用TXE+TC标志
面对的问题是:中断发送时——发送缓冲区不为空(帧没发送完),新帧就将其覆盖。(而不是两包之间(TC就可保证无误))
DMA发送时——发送缓冲区不为空(包没发送完),新包就将其覆盖。(注:DMA发送模拟打包和拆包,就是说DMA连续发送两包时,不用担心一包内的数据覆盖非空发送缓冲区的情况)
参考手册,图251"发送时TC/TXE的变化情况":
其实参考手册里已经说明了如何防止发送缓冲区里的内容被覆盖(DMA部分):
------------------------------------------实现------------------------------------------------
DMA下发送部分程序:
#if BSP_485_DMA_EN USART_ITConfig(BSP_USART_485, USART_IT_TC, ENABLE); while((USART_GetFlagStatus(BSP_USART_485, USART_FLAG_TXE) == RESET)|| //这两行保证了发送缓冲区不被覆盖!! (USART_GetFlagStatus(BSP_USART_485, USART_FLAG_TC) == RESET)) {} DMA_Cmd(BSP_485_DMA_T_CH, DISABLE); BSP_485_DMA_T_CH->CNDTR = len; ///发送数量设置 DMA_Cmd(BSP_485_DMA_T_CH, ENABLE);
串口单个/中断发送下的程序:
http://blog.sina.com.cn/s/blog_53219feb0100ncaj.html
BUT!!头儿要求有根据,而不是实验结果没错就行了。所以,我要搞明白DMA发送两包时,有没有可能被接收端看成一包,也就是说发送端总线空闲(高电平)的时间至少为多久。
我离彻底明白还有段距离啊,啊啊啊啊啊啊啊啊啊啊
继续研究,第二波。。。。
一、首先需要知道stm32总线架构。 参见我的文章《【漂亮!!】DMA深度剖析》 http://blog.csdn.net/ysmz4/article/details/46681877
然后基本可以解释这个问题:
Q:其他任务抢占有没可能令dma发送不完全(即被打断)?
A:有可能,但有前提。
原因:多层结构允许两个主设备并发执行数据传输,只要他们寻址到不同的设备。(《AN2548 应用笔记 》)(应该理解为不同的从总线)
《STM32F10x 产品架构的效率》示例图有说明。
”DMA和CPU只是在需要通过一个给定的从总线进行数据访问时才会产生竞争。“
总线挪用 vs 突发模式。参考手册里只在以太网中发现突发模式。
”推荐DMA总线使用保持在2/3以下。“
(ysmz4:看不太懂,项目完成后需要计算DMA使用时间。)
二、USART_DMA时序
(自定义的DMA接收函数是假设已知接收长度。所以只凭分析将得出:若两帧真的被DMA receiver看做一帧,则第二帧将被丢弃。为了知道是否有这种情况,需要研究两帧之间的间隙是否足够长(被DMA receiver探测到))
暂不考虑cpu与DMA的总线竞争。
那么:当两包连续到来时,DMA接收期待是都接收到,并放到不同的fifo。(而不是两包(or几包)被认为是一包而导致放到同一个fifo)
接收数据包的长度上层是已知的(接口看来是这样)。
连续来的两包被DMA接收端看做一包的条件是:两包之间时长小于idle中断置起需要的时间——因为 接收端根据idle中断判断一包接收完毕。
idle中断置起的条件是:总线空闲中断是在检测到在接收数据后,数据总线上一个字节的时间内,没有再接到数据后发生。
idle需要一个字符的时长,modbus需要3-5个字符时长来证明到结尾。但是还是没说服力说明用DMA idle接收来替代发送后给出延时。
现在我需要足够证据证明(如果能的话)两包间的时延大于一帧。
两包之间时长最短为多少?
- 【待续,啊啊啊啊】【找了一遍,最后成功!!】stm32 USART 防止发送缓冲区被新来的数据覆盖
- easyUI获取tree的数据对象,啊啊啊啊啊啊啊啊啊啊啊啊
- 妈的果然让我做出来了, 我的特等奖啊啊啊啊啊啊啊啊啊
- 啊啊啊啊啊啊 !!! 大仙收了我吧!!
- 啊啊
- 啊啊
- 啊啊
- 啊啊
- 啊啊
- 啊啊
- 啊啊
- 啊啊
- 啊啊
- 啊啊
- 啊啊
- 啊啊
- 啊啊
- 啊啊
- codereview启发
- RTT学习笔记之内存管理(动态内存)
- oracle connect by用法
- 1.2. 初窥输入/输出
- iOS第三方开源库的吐槽和备忘
- 【待续,啊啊啊啊】【找了一遍,最后成功!!】stm32 USART 防止发送缓冲区被新来的数据覆盖
- Linux下用C语言检查指定程序名的运行实例个数
- 关于httpservice和webservice
- C++细节7
- 移动开发:dequeueReusableCellWithIdentifier的运行机制
- C#右下角弹窗不影响主程序的另类实现
- 【Android】日期拾取器、时间拾取器与菜单
- keil 编译后 flash 和 ram 占用情况
- Console2:Windows命令行威力加强版