首页 > 其他分享 >STM32-USART打印字符、字符串函数自己犯的错误反思

STM32-USART打印字符、字符串函数自己犯的错误反思

时间:2023-01-27 21:45:17浏览次数:47  
标签:USART TXE Send STM32 while str USARTx 字符串

void UART_Send_Byte(USART_TypeDef *USARTx, uint8_t cha)
{
	USART_SendData(USARTx, cha);
	while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE)==RESET) ; 
}

 其中while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE)==RESET) ; 这句代码非常重要,

如果没有这句代码,发送一连串数据的时候就可能出现:

USART的发送寄存器(TDR)还没发送出去数据,就被总线新来的数据覆盖,最后可能只打印出一个字符。

 


发送字符串函数应该为:

void UART_Send_String(USART_TypeDef *USARTx, char *str)
{
    int i=0;
    #if 0   
    while(*(str+i)!='\0')
    {
        USART_SendData(USARTx, *(str+i));//错误的,没有进行TXE检测
        i++;
    }
    #endif
    
    #if 1
    do
    {
        UART_Send_Byte(USARTx, *(str+i));//正确的,进行了TXE检测
i++; }while(*(str+i)!='\0'); #endif while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET) ; }

 

标签:USART,TXE,Send,STM32,while,str,USARTx,字符串
From: https://www.cnblogs.com/FBsharl/p/17069387.html

相关文章

  • 字符串格式化、字符串补0
    不够6位用0在左边补0Longcount=getCountByPredicate(booleanExpression);returnString.format("%06d",count); ......
  • 字符串中连续最多的字符&次数
    双层for循环constrepeatStrAndNumsByDoubleLoop=(str='aabbbcccddeeefffff')=>{constres={char:'',len:0}const{le......
  • 力扣每一一题2023.1.26---1663. 具有给定数值的最小字符串
    小写字符的数值是它在字母表中的位置(从1开始),因此a的数值为1,b的数值为2,c的数值为3,以此类推。字符串由若干小写字符组成,字符串的数值为各字符的数值之和。例......
  • C#利用String类的IndexOf、LastIndexOf、Substring截取字符串
    一、String.IndexOfString.IndexOf方法(Char,Int32,Int32)报告指定字符在此实例中的第一个匹配项的索引(从0开始)。搜索从指定字符位置开始,并检查指定数量的字符位置。S......
  • 求字符串最长重复子串的可视化演示
    求字符串最长重复子串的可视化演示假设字符串采用顺序存储结构,设计可视化算法将s中出现的第一个最长重复子串标记为红色。数据结构课程设计实验指导书数据结构教学团队......
  • KMP字符串匹配问题
    KMP算法本文参考资料:https://www.zhihu.com/question/21923021KMP算法是一种字符串匹配算法,可以在\(O(n+m)\)的时间复杂度内实现两个字符串的匹配。字符串匹配问题首......
  • C语言:判断回文字符串
    #include<stdio.h>#include<string.h>intfh(charab[]){intlen=strlen(ab),a=0;for(a=0;a<=len;a++)if(ab[a]!=ab[len-a-1])return0;retur......
  • C语言:数字字符串转数字求和
     #include<stdio.h>#include<string.h>main(){charzf[7],zfa[7];inta=0,b=0,c=0,len1,len2;gets(zf);gets(zfa);len1=strlen(zf),len2......
  • C语言字符串首字母大写
    #include<stdio.h>#include<string.h>main(){charch[100];inti=0,n=0;gets(ch);while(ch[i]!='\0'){if(i==0){......
  • C语言:scanf()输入多个字符串
    #include<stdio.h>#include<string.h>#include<stdlib.h>//利用<string.h>中的strtok函数,缺点就是异常复杂,但是优点就是可以用各种字符来分割输入的字符串intmain()......