使用单片机的串口打印功能

转载请注明出处
个人看法,仅供分享

单片机调试手段:

1、在线调试

部分芯片支持该功能,典型的有STM32系列的SWD接口,沁恒的CH32V和CH32F系列、CH56X部分RISC-V的两线调试。

2、串口打印

串口打印功能应该是个单片机都能够支持,在51上是特别常用的手段,STM32上根据使用者习惯可能用在线调试功能会多一点。


实现原理:

1、在线调试

芯片本身具备的一个硬件功能,需要在芯片设计阶段就做进去,并且因为硬件实现的功能,实际使用可能需要特定芯片才能支持,同时需要配套特定的外部工具才能实现,可以实现程序的单步运行、程序任意处的断点,做到变量的监控。

2、串口打印

由软件实现,默认是借助芯片硬件串口输出printf函数的内容,printf函数通过标准C库实现,能够实现字符、变量的格式化输出。当然也可以魔改底层printf回调的输出功能函数,实现任意接口、IO的输出、状态响应。

这个部分可以参考:51单片机标准串口使用教程及常见问题: 点这里


个人分享:

串口打印功能的价值:入门单片机的时候用的STC8051,工作初期包括入坑深了之后,调试单片机代码一直使用的是串口打印。接触到的代码模板,逐步养成的编程思维、编程习惯都适应了串口打印方式。

一直没有用在线调试,主要考虑到调试的一些接口通讯时,实质上是不允许单步和断点的,往往接口停下来的结果就是断连,比如USB口、网口、BLE。这些接口,一是不允许停,二是这些接口通常都有完善的底层,出问题多半是协议层,应用层逻辑的问题,是在通讯过程中产生的错误,CPU停了,通讯断了,也就没问题了。三是大型的、复杂的接口,一般都是函数库形式,即使调试,也看到不什么。

串口打印功能其实是挺方便的,硬件设计的时候预留个插针,最少两根线也能观察芯片的运行状况了(TXD、GND)。用于输出的串口的波特率调高一点,对于程序运行的影响其实也不大,同时底层实现是占用CPU的,也不会影响芯片响应中断。可以在代码任意地方输出变量,CV一下就能增加一个状态输出,也挺快。同时配合一些电脑上的串口接收助手,单片机做好格式输出,能够直接将数据保存CSV,导入excel能够绘制线图,十分方便,在评估ADC性能的时候经常用这个方式,ADC采样正弦波,串口输出,excel绘图,和信号发生仪的正弦波函数做对比,轻轻松松看出误差。可能在线调试也能做到(没有深入用过),但是要是换了一个单片机、开发环境、调试器,到时候实现类似操作又要从头开始。串口打印的通用性是最好的!同时串口还能用来监控实际产品的运行状态,类似留给产品调试人员的后门,串口的通用性,带来的是产品整个生命周期的调试方便。

### 51单片机实现串口打印方法 #### 理解51单片机串口硬件电路 为了成功配置并利用51单片机进行串口通信,理解其内部结构至关重要。51系列单片机内置了一个全双工UART(通用异步收发传输器),能够处理数据的接收与发送操作[^1]。 #### 配置波特率及时钟源 设置合适的波特率对于确保正确无误的数据交换非常重要。通常情况下,在初始化阶段会设定SMOD寄存器中的特定位来调整波特率因子,并通过定时器T1作为波特率发生器的一部分来进行更精确的速度调节。 #### 编写程序控制单片机发送信息给硬件电路 下面是一个简单的例子展示如何编写一段C语言代码用于启动51单片机上的串行端口并向外部设备发送字符串: ```c #include <reg52.h> sbit LED=P1^0; void UART_Init(void){ TMOD = 0x20; // 设置定时器模式为8位自动重装载 TH1 = 0xFD; // 设定初值, 波特率为9600bps@12MHz晶振频率下 SCON = 0x50; // 8-bit可变长度帧格式,允许接收 TR1 = 1; // 启动定时/计数器1 } void SendChar(unsigned char ch){ SBUF = ch; while(!TI); // 等待直到字符被完全发出 TI = 0; // 清除中断标志位 } void SendString(char *str){ while(*str != '\0'){ SendChar(*str++); } } void main(){ UART_Init(); while(1){ SendString("Hello World!\r\n"); for(int i=0;i<10000;i++); // 延迟循环 } } ``` 此段代码实现了基本的功能:初始化串行接口、定义函数`SendChar()`用来逐字节传送ASCII码表示的文字以及组合这些文字形成完整的消息由`SendString()`完成最终的信息输出过程[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值