STM32之USART库函数USART_SendData的bug
转载自:http://www.cnblogs.com/itloverhpu/p/3250537.html
1.最近在调试ATM32F103CB时发现,一串数据的最后一个字节总是发送不出去,用的是RS485收发;
2.代码如下:
void uartReturn(unsigned char childBoardAddr)
{
uchar temp = 0; //must have
temp += 0xAB;
temp += childBoardAddr;
temp += 0x30;
temp += 0x01;
temp += childBoardAddr;
RS485_TX_EN; //enable rs485 tx
sendByte(0xAB);
sendByte(childBoardAddr);
sendByte(0x30);
sendByte(0x01);
sendByte(childBoardAddr);
sendByte(temp);
RS485_RX_EN; //enable rs485 rx
}
其中:sendByte函数如下:
void sendByte( unsigned char data)
{
//RS485_TX_EN;
USART_SendData( USART2,data );
while( USART_GetFlagStatus( USART2,USART_FLAG_TXE ) == RESET ); //数据没有被传入输出移位寄存器,则一直等待下去
//RS485_RX_EN;
}
同事帮忙改了一下lib库函数:USART_SendData,在其后面加了: while((USARTx->SR&0x40)==0);//////////发现最后一字节数据会漏发,才加上的;
这调语句可不就是等价于:while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET)吗;
>>>>>>>>来看看网上是怎么说的?
用串口连续发送一串数字时,第一个数总是发不出去,我用STM32F103ZE,STM32F103CB都是这样的情况,以下是代码:
USART_SendData(USART1,0x06);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
USART_SendData(USART1,0x07);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
USART_SendData(USART1,0x08);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
呵呵,第一字节发送不出去,看网友是怎么分析解答的吧:
1:这个问题的根本原因是复位后,TC和TXE标志位默认都是1,很多人喜欢这样写:
USART_SendData(USART1, (u8) ch); while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
while在发送第一个字节时没有起到应有作用,直接跳出,接着写第二个字节,这时第一个字节还未发出,数据被破坏了.
看看datasheet,果然复位以后,SR=0x00c0;TC=TXE=1;
疑问:为什么网友说:只要第一个用TXE,其它用什么标志无所谓,都能正常发送。按道理,TXE也没起到保护啊!!!
2.while的确很费时,另外当TDR寄存器中的数据被硬件转移到移位寄存器的时候,TXE被硬件置位(注意:单缓冲器传输中使用该位);当包含有数据的一帧发送完成后,并且TXE=1时,由硬件将该位置’1’,只有在多缓存通讯中才推荐这种清除程序。其中TC判断的是一帧数据,而TXE是当TDR数据传到移位寄存器就被置位了,所以TC的时间比较长,很容易被下一次数据覆盖~~~所以一般喜欢判断TXE,数据写到DR就可以了 ,剩下的工作就交给硬件了
3.一般的用TXE就可以了, TC一般用于需要延时的场合,比如说是232/485转换器,需要得到TC后,才能将发送改变成接收,否则最后一个字节发送不完全。
看来,3很符合我的情况:我的相当于2个等待:
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET; //@1
while( USART_GetFlagStatus( USART2,USART_FLAG_TXE ) == RESET ); //@2
考虑一下:@2能不能拿掉呢??
STM32之USART库函数USART_SendData的bug的更多相关文章
- STM32 串口功能 库函数 详解和DMA 串口高级运用(转载)
数据传输时要从支持那些相关的标准?传输的速度?什么时候开始?什么时候结束?传输的内容?怎样防止通信出错?数据量大的时候怎么弄?硬件怎么连接出发,当然对于stm32还要熟悉库函数的功能 具起来rs232 ...
- STM32的USART DMA传输(转)
源:STM32的USART DMA传输 问题描述: 我有一个需求,AD采得一定数目的数据之后,由串口DMA发出,由于AD使用双缓冲,所以每次开始DMA的时候都需要重新设置开始的内存地址以及传输的数目( ...
- STM32串行通信USART解说笔记
STM32串行通信USART程序例举链接:http://blog.csdn.net/dragon12345666/article/details/24883111 1.STM32串行通信USART的相 ...
- [stm32] NRF24L01+USART搞定有线和无线通信
前言 一般进行远程监控时,2.4G无线通信是充当远程数据传输的一种方法.这时就需要在现场部分具备无线数据发送装置,而在上位机部分由于一般只有串口,所以将采集到的数据送到电脑里又要在上位机端设计一个数据 ...
- STM32通过调用库函数进行编程
1.调用库函数编程和直接配置寄存器编程的差别: 2.CMSIS标准: 3.STM32库函数的组织: 4.程序例举: 调用库函数实现通过USART发送数据(26个大写的英文字母) 首先:在主函数部分先要 ...
- STM32串口USART的使用方法和程序
通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换. USART利用分数波特率发生器提供宽范围的波特率选择,支持同步单向通信和半 ...
- STM32 DMA USART ADC
转载自:http://www.cnblogs.com/UQYT/articles/2949794.html 这是一个综合的例子,演示了ADC模块.DMA模块和USART模块的基本使用. 我们在这里设置 ...
- stm32之USART学习
首先,我是看着这位博主的文章受到的启发,进而加深了自己对USART的理解.下面是自己改装并实验过的程序. 原文:http://www.cnblogs.com/greatwgb/archive/2011 ...
- STM32基础分析——USART的DMA模式
有关USART的DMA传输模式,其基本的概念和配置,网上有很多博客和教程都有,这里不再赘述,只是记录一下比较容易忽视而造成调试不通的问题. 1. 串口发送和接收分属两个DMA通道 一般方式操作串口时, ...
随机推荐
- node.js处理post请求
1.html 2.app.js var http = require('http') var qs = require('querystring') /** * 路由控制的功能 * @param pa ...
- spring amqp rabbitmq fanout配置
基于spring amqp rabbitmq fanout配置如下: 发布端 <rabbit:connection-factory id="rabbitConnectionFactor ...
- 七个结构模式之适配器模式(Adapter Pattern)
定义: 将一个接口转换为客户需要的另外一个接口,使接口不兼容的类型可以一起工作,也被称为包装器模式(Wrapper Patern). 结构图: Target:目标抽象类,客户所需要的接口. Adapt ...
- [转]Dcloud App离线本地存储方案
原文地址:http://ask.dcloud.net.cn/article/166 HTML5+的离线本地存储有如下多种方案:HTML5标准方案:cookie.localstorage.session ...
- 使用Yeoman快速启动AngularJS项目开发
本博客停止更新,请访问新个人博客:owenchen.net 前言 博客迁移到了BAE上,http://owenchen.net/,以后的文章会首发在自己的博客上,随后在博客园发布. 很久没有写文章了, ...
- HTML5 Maker – 在线轻松制作 HTML5 动画效果
HTML5 Maker 是一个在线动画制作工具,帮助你使用 HTML,CSS 和 JavaScript 创建动态,互动的内容.它非常容易使用,同时可以帮你实现非常好的效果.它可以制作跨浏览器的动画内容 ...
- React入门--------顶层API
React.createClass 参数:config(object) 创建一个ReactClass(组件类),参数是一个对象且必须带有render属性方法,该方法必须返回一个封闭的容器(容器内可以由 ...
- CSS3之3D变换实例详解
CSS3的3D效果很赞,本文实现简单的两种3D翻转效果.首先看效果和源代码,文末是文绉绉的总结部分^_^ 以下CSS代码为了简洁没有添加前缀,请视情况自行添加(自动化时代推荐使用其他的一些方法,如gu ...
- js中如何获取纯正的undefined?
1.为什么要获取undefined? 因为undefined在javascript中不是保留字,可以被用户当做变量来赋值,这样如果我们后期需要用到undefined来检测一个变量的话,那么检测的值就不 ...
- RT-Thread入门和模拟器的配置生成
RT-Thread是一个国产开源的实时操作系统,支持MCU多,外设丰富.值得学习 下载地址:http://www.rt-thread.org/page/31.html ,解压可以得到一下目录结构:|- ...