文章标题

本人也是新手,下面是学习串口过程中自己的一点认识,与君共享。
STM32的串口有很多值得关注的地方。

TEX、TC标志位的概念:
TEX(Transmit data register empty)发送数据寄存器非空标志位
TC(Transmission complete)发送完成标志位
两个标志关系很密切同时又有很大的差别,串口发送需要两个寄存器,我们可以“看见”操作的是影子寄存器——即Data Register(数据寄存器),实际用来发射和接收的是移位寄存器,Shift Register(移位寄存器)我们无法直接操作。当数据发送的时候,我们把要操作的数写进了Data Register,在串口发送使能的情况下,单片机内部会将数据整体放进Shift Register(并行传输,8位数同时进入),此时数据寄存器为空,从而TEX被置1。随后Shift Register将数据以特定的波特率串行输出,当最后一位也输出完成之后,发送过程结束,从而TC位置1,这样就完成了一个字节数据的传送。
以上理解以后,发送一个字符串就有了两种方法:判断TEX置位和判断TC置位。
判断TEX置位,程序如下:
void USART_SendString(char *str)
{
while(*str)
{
USART_SendData(COM_USART,*str);
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
str++; //str的地址增加1,到下一个字符
}
}
判断TC位,程序如下:
void USART_SendString(char *str)
{
while(*str)
{
USART_SendData(COM_USART,*str);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
str++; //str的地址增加1,到下一个字符
}
}
至于什么时候使用哪个标志,需要根据你的需要自己决定。但我认为TXE允许程序有更充裕的时间填写TDR寄存器,保证发送的数据流不间断。TC可以让程序知道发送结束的确切时间,有利于程序控制外部数据流的时序。(此段摘自网上)

关于第一个数据发送失败的问题
请注意:在当USART被使能的时候,单片机自身会自动一个Idle preamble,也就是一个全为1的字符。发送完成之后,TXE = 1,TC = 1。如果这时发送字符串使用的是判断TC置位的方法的话,程序第一次while没有等待,立即循环执行第二次的USART_SendData(COM_USART,*str);程序,第一个数据来不及发送出去就被第二个数据覆盖,造成丢失。解决的方法是在USART_Cmd(USART1,ENABLE)之后加上两行:
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);//空帧发送完毕
USART_ClearFlag USART1,USART_FLAG_TC);//清除TC标志位
这样第一个数据就能正常发送了。当然,如果发送字符串使用的是判断TEX置位的方法,就不会出现丢失首自己的现象。因为把数据写入Data Register后,必须等待直到数据被送到Shift Register才能继续往后执行。
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值