51单片机串口输出问题(第一个字符重复,自动循环输出第一个字符)

news/2025/3/13 4:09:39/

遇到的问题描述

单片机>51单片机使用串口发送数据时出现只循环发送字符串的第一个字符的情况。就算发送的是第一个字符也有时候一直发送。

串口函数代码

参考串口发送注意

#include <reg52.h>		 //此文件中定义了单片机的一些特殊功能寄存器void UsartInit()
{SCON=0X50;			//设置为工作方式1      TMOD=0X20;			//设置计数器工作方式2,8位自动重装PCON=0X00;			//波特率加倍,最高位控制是否加倍TH1=0XFa;				//计数器初始值设置,注意波特率是4800的TL1=0XFa;ET1=0;   //关闭定时器1中断ES=1;						//打开串口中断REN=1;     //允许接收EA=1;						//打开总中断TR1=1;					//打开计数器
}
void UART_SendByte(unsigned char Byte)
{  //这里如果没放在中断中而是在主函数进行发送,可能导致接收无法进入中断//ES=0; SBUF = Byte;while (!TI);TI = 0;//ES=1;
}void uartSendString(char *pS)
{while (*pS)                      //检测字符串结束标志{UART_SendByte(*pS++);         //发送当前字符}
}

分析导致问题的原因

参考程序跑飞问题,串口只显示一个字符
第一种猜想,发送一个字符完成后不能触发TI置位,导致程序停留在将第一个字符在缓冲区,且一直发送。
第二种猜想,程序触发中断后没有对中断进行处理,导致程序跑飞,使得程序从主函数main开始再次执行,也会出现一直打印第一个字符的情况。这种和参考文章程序跑飞问题中的第一种情况很像。
从多次实验来看,在程序添加了对串口的中断函数后,即使没有对发送完成的标志在中断中处理,程序也能正常运行。但一旦去除串口中断函数,那么就会出现重复打印第一个字符的情况。所以认为第二种猜想的可能性更大。
下面是在主函数中添加的中断函数代码

口中断,处理接收和发送问题void Usart() interrupt 4
{if (RI == 1)					//如果接收标志位为1,接收到了数据{if(SBUF=='1')uartSendString("YOU ARE RIGHT!!\n");	//将受到的数据发回串口RI = 0;					//接收标志位清0}}

思考另一种只显示第一个字符的情况

如果在主函数中调用发送字符串的函数,而串口中断出现对发送中断标志TI置零,那么在主函数种的发送字符等待标志位置位可能会永远无法实现,但这种只会发送一次第一个字符。
在这里插入图片描述


http://www.ppmy.cn/news/1424468.html

相关文章

Windows上构建 Chisel-Bootcamp

windows环境构建本地Chisel-Bootcamp 安装摘要Chisel-boocamp环境搭建安装java安装Anaconda安装scala 下载Chisel-bootcamp 环境Reference 安装摘要 在windows上安装chisel-boocamp&#xff0c;与linux过程类似。 安装java8安装anaconda安装scala下载Chisel-bootcamp环境 Ch…

并发场景下 缓存击穿 穿透 雪崩如何解决

最近建了一个技术交流群&#xff0c;欢迎志同道合的同学加入&#xff0c;群里主要讨论&#xff1a;分享业务解决方案、深度分析面试题并解答工作中遇到的问题&#xff0c;同时也能为我提供写作的素材。 群号 208236931&#xff0c;欢迎进群交流学习&#xff0c;一起进步、进步、…

泛型的初步认识(1)

前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&#x…

【Linux】地址空间虚拟地址

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 虚拟地址1.1 虚拟地址引入1.2 虚拟地址理解1.3 虚拟地址细节问题 2. 地址空间2.1 理解地址空间2.2 页表和写时拷贝 3. 进程调度 1. 虚拟地址 1.1 虚拟地址引入 先先来一个测试代码&#xff1a; 1 #include<st…

深入探讨虚拟现实中的新型安全威胁:“盗梦攻击”及其防御策略

随着虚拟现实&#xff08;VR&#xff09;技术的飞速发展&#xff0c;用户体验达到了前所未有的沉浸水平&#xff0c;但也暴露在一系列新的安全威胁之下。本文着重介绍了近期出现的一种高度隐秘且影响深远的攻击手段——“盗梦攻击”。这一概念由芝加哥大学的研究人员提出&#…

【每日刷题】Day7

【每日刷题】Day7 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 2. 203. 移除链表元素 - 力扣&#xff08;…

C++反向迭代器的封装和模板进阶(个人笔记)

C反迭代器和模板进阶 1.反向迭代器2.模板2.1非类型模板参数2.2模板的特化2.2.1函数模板2.2.2类模板特化2.2.2.1 全特化2.2.2.1 偏特化 2.3模板的分离编译2.4模板的优缺点 1.反向迭代器 用正向迭代器适配出反向迭代器 这里是自己实现的反向迭代器版本&#xff0c;与STL标准库里…

监督算法建模前数据质量检查

一、定义缺失值检测函数 def missing_values_table(df):# 总的缺失值mis_val df.isnull().sum()# 缺失值占比mis_val_percent 100 * df.isnull().sum() / len(df)# 将上述值合并成表mis_val_table pd.concat([mis_val, mis_val_percent], axis1)# 重命名列名mis_val_table_…