跳转到主要内容

串口发送的这几种写法,你用过几种?

<strong><font color="#004a85">一、STM32用USART发送字符串</font> </strong>

<pre style="overflow-x:auto; background-color:#e9e9e9;">
void UART_Send_Message(u8 *Data)
{
while(*Data!='\0')
{
USART_SendData(USART1, *Data);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//读取串口状态
Data++;
}
}

void main(void)
{
u8 str_buf[500];
memset((char *) &str_buf, 0, sizeof(str_buf));
UART_Send_Message(str_buf);
}</pre>

<center><img src="http://mcu.eetrend.com/files/2021-09/wen_zhang_/100553757-220740-1.jpg&…; alt=“串口发送的这几种写法,你用过几种?></center>
<center><img src="http://mcu.eetrend.com/files/2021-09/wen_zhang_/100553757-220741-2.jpg&…; alt=“串口发送的这几种写法,你用过几种?></center>

<pre style="overflow-x:auto; background-color:#e9e9e9;">while(SET == USART_GetFlagStatus(USART1,USART_FLAG_RXNE));</pre>

含义是:当接收引脚有数据时,状态寄存器的USART_FLAG_RXNE就会为1,此时USART_GetFlagStatus(USART1,USART_FLAG_RXNE)的返回值就为1(SET),若无数据则为RESET。

<strong><font color="#004a85">二、USART_FLAG_TXE和USART_FLAG_TC怎么用</font> </strong>

这里主要说的是在特殊情况下发送字符软件代码的写法。

特殊情况指的是:

1)调用发送字符串函数“发送完”本机立即掉电;

2)调用发送字符串函数“发送完”从机立即掉电;

【上面两种主要用于芯片对电源控制的项目中】

3)调用发送字符串函数“发送完”立刻进入待机或停机;

其实本文主要说的是两个标志位:USART_FLAG_TXE 和 USART_FLAG_TC.

USART_FLAG_TXE发送缓冲区空标志:说明可以往数据寄存器写入数据了,但并不代码数据发送完成了。

USART_FLAG_TC发送完成标志:这个才是代表USART在缓冲区的数据发送完成了,即从机接收到了数据。

这两个标志的区别在于:它们分别表示数据在发送过程中,在两个不同的阶段中的完成情况。TXE 表示数据被从发送缓冲区中取走,转移到的移位寄存器中,此时发送缓冲是空的,可以向其中补充新的数据了。而 TC 则表示最后放入发送缓冲区的数据已经完成了从移位寄存器向发送信号线 Tx 上的转移。所以,判定数据最终发送完成的标志是 TC,而不是 TXE。

下面讲述在不同代码写法下,得到不同实验效果【调试助手接收数据】:

<strong>常见写法一 </strong>

<center><img src="http://mcu.eetrend.com/files/2021-09/wen_zhang_/100553757-220742-3.png&…; alt=“串口发送的这几种写法,你用过几种?"></center>
<center><img src="http://mcu.eetrend.com/files/2021-09/wen_zhang_/100553757-220743-4.png&…; alt=“串口发送的这几种写法,你用过几种?"></center>

这种写法在不是特殊(不掉电、不待机等)情况下,问题不大,USART数据会成功发送出去。但是在上面说的特殊情况下,问题就来了,代码只将数据放到了发送缓冲区,而没有发送出去就掉电或待机了,这个时候其实最后两个字符是没有发送出去的。

<strong>2、常见写法二 </strong>

<center><img src="http://mcu.eetrend.com/files/2021-09/wen_zhang_/100553757-220744-5.png&…; alt=“串口发送的这几种写法,你用过几种?"></center>
<center><img src="http://mcu.eetrend.com/files/2021-09/wen_zhang_/100553757-220745-6.png&…; alt=“串口发送的这几种写法,你用过几种?"></center>

这种写法达到的效果和上面存在不同的就是倒数第二个数据发送出去了,也就是只有最后一个字符是没有发送出去的。

<strong>3、常见写法三 </strong>

<center><img src="http://mcu.eetrend.com/files/2021-09/wen_zhang_/100553757-220746-7.png&…; alt=“串口发送的这几种写法,你用过几种?"></center>
<center><img src="http://mcu.eetrend.com/files/2021-09/wen_zhang_/100553757-220747-8.png&…; alt=“串口发送的这几种写法,你用过几种?"></center>

这种写法达到的效果和上面两种写法有不一样,发送了10个字符。

<strong>4、写法四 </strong>

<center><img src="http://mcu.eetrend.com/files/2021-09/wen_zhang_/100553757-220748-9.png&…; alt=“串口发送的这几种写法,你用过几种?"></center>
<center><img src="http://mcu.eetrend.com/files/2021-09/wen_zhang_/100553757-220749-10.png…; alt=“串口发送的这几种写法,你用过几种?"></center>

这种写法按理说可以实现功能,但实际多次试验结果确实第一字节数据丢失了。

<strong>5、写法五(正确写法) </strong>

<center><img src="http://mcu.eetrend.com/files/2021-09/wen_zhang_/100553757-220750-11.png…; alt=“串口发送的这几种写法,你用过几种?"></center>
<center><img src="http://mcu.eetrend.com/files/2021-09/wen_zhang_/100553757-220751-12.png…; alt=“串口发送的这几种写法,你用过几种?"></center>

这种写法是比较完成,为了保守起见,在特殊情况下使用该写法。。

至此,常见软件写法都给出了源代码和试验效果,请根据自己实际情况写代码验证。

来源:网络
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。