在使用IAR开发STM32项目时,使用串口或者是虚拟终端来输出我们想看的信息是一个非常好而且简便的方式。

首先来看看串口怎么实现信息输出。简单来说串口输出信息就是将标准输出重定向到串口,在上位机的超级终端或者串口助手等工具中查看结果。

在使用串口之前要配置串口,这一点是串口应用的基本知识,如果要通过串口输入参数可能还需要使用中断。关于串口配置和终端配置,应根据具体是用来实现。这里主要说一下标准输出的重定向。

标准库中的printf函数实际调用了int fputc(int ch, FILE *f)函数,所以我们要重载这个函数,实现从串口输出数据。

int fputc(int ch, FILE *f)
{ while (USART_GetFlagStatus(USARTn, USART_FLAG_TC) == RESET){}USART_SendData(USARTn, (uint8_t) ch);return ch;
}

当然,如果想通过串口输入参数还需要从在标准输入函数,如:

int GetKey (void)
{while (!(USARTn->SR & USART_FLAG_RXNE));return ((int)( USARTn->DR & 0x1FF));
}

完成以上重载后,在程序中使用printf函数打印信息时,就会从串口输出信息。接到上位软件的画就可以在上位机看到这些信息,便于查看调试。

接下来我们看一看在IAR虚拟终端中查看输出结果,这个相对要简单得多。只需要做一些必要的设置即可将标准输出重定向到IAR虚拟终端中。

在开始之前,必须在使用printf函数的的文件中引用stdio.h。这一点毋庸置疑,与任何外部函数的调用是一样的。然后开始设置:

右键点击项目名称并在弹出菜单中点击“Options”或者在软件“Project”菜单中点击“Options”。

弹出Options界面后在左侧列表框中选择“General Options”,在右侧的Tab界面中选择“Library Configuration”标签,如下图红框所示:

在“Library Configuration”标签下,将Library改为全库“Full”,将“stdout/stderr”改为“Via SWO”,如下图红框所示。

在完成上述设置后如果没有其他的输出设置,当在线调试时,打开View菜单中的“Terminal IO”(如下图红框所示),就可在IAR中显示输出了,当然也可以输入数据。

如果在使用IAR虚拟终端时重载了输入输出函数,则不会从IAR虚拟终端输出,每次修改很麻烦,我们可以写一个源文件通过条件编译来实现我们想要的输出方式。

定义两个宏来控制我们要要的方式:

/*启用调试使用功能代码*/#ifndef DEBUG_CODE_ENABLE#define DEBUG_CODE_ENABLE (1)#endif

在调试时,将DEBUG_CODE_ENABLE设为1,方便查看,在项目正式发布时则可将DEBUG_CODE_ENABLE设为0将这段代码屏蔽。

/*定义开关串口打印的宏,当为1时使用串口输出,当为0时使用IAR虚拟终端*/#ifndef USART_PRINT_ENABLE#define USART_PRINT_ENABLE (0)#endif

而在使用时,如果输出的内容数量和种类比较多的话,实现起来比较乱而且可能破环其他部分代码的整体性和可读性。我们可以使用函数指针来集中操作,这样无论是代码还是输出信息的完整性都可以保证,而且实现条件编译也变得更简洁。

先定义一个打印对象类型的枚举类型和一个打印对象的结构体,如下:

/*定义一个打印对象数据类型的枚举,有新类型是在此添加即可*/typedef enum{pChar,pInt8,pInt16,pInt32,pFloat,pString}PrintType;/*定义一个答应对象的结构体类型*/typedef struct{PrintType printType;void * objValue;}PrintObject;

再定义一个函数指针数组用于存放打印函数的指针:

int (*ObjPrintf[])(void *objValue)={CharPrintf,Int8Printf,Int16Printf,Int32Printf,FloatPrintf,StringPrintf};

并定义一个调用打印的函数:

/*调试时批量打印输出函数*/

void DebugOutput(PrintObject * printObject,uint16_t amount);

对于具体的实现函数根据自己的要求实现就可以了。

在调用时只需要定义一个要输出的对象数组并将其作为参数传递给DebugOutput汗数据可以了。

 /*启用调试辅助代码时,初始化显影的参数*/#if DEBUG_CODE_ENABLE > (0)char title[]="\nThe result is:";PrintObject printObject[]={{pString,title},{pFloat,&o2Concentration},{pFloat,&h2Concentration},{pFloat,&ch4Concentration}};/*如果启用了串口打印输出功能,则初始化串口配置*/#if USART_PRINT_ENABLE > (0)PrintUsartConfiguration();#endif#endif/*用于测试*/#if DEBUG_CODE_ENABLE > (0)DebugOutput(printObject,sizeof(printObject)/sizeof(PrintObject));#endif

如此就可以非常方便的输出信息、并可根据自己的需要控制是否输出调试信息,采用何种信息输出方式了,对调试来说非常有帮助。

转载于:https://www.cnblogs.com/foxclever/p/6008496.html

添加串口和虚拟终端输出帮助调试相关推荐

  1. 没有串口,如何打印单片机调试信息?

    输出调试信息是嵌入式开发中必不可少的调试利器,嵌入式开发的一个特点是很多时候没有操作系统,或者没有文件系统,常规的打印log到文件的方法基本不适用. 最常用的是通过串口输出uart log,例如51单 ...

  2. STM32F103学习记录——通过额外添加串口接口来接入ZigBee/蓝牙模块实现数据的远程传输

    目录 项目场景 硬件准备 实现过程 实现缘由 原理展现 成果展现 USB-TTL模块有线数据展示 ZigBee模块远程传输数据展示 最后总结 项目场景 本人在做STM32硬件开发项目中,传输数据这一块 ...

  3. C# WinForm 添加Windows Media Player 控件调试出现未能加载文件或程序集Interop.WMPLib,该怎么解决...

    C# WinForm 添加Windows Media Player 控件调试出现未能加载文件或程序集Interop.WMPLib 如标题,在窗体中添加Windows Media Player 控件,当 ...

  4. SEGGER公司JlinkV9仿真器实现串口通讯VCOM和SWD调试双功能

    在调试ARM的Cortex®内核的处理器时,大家普遍使用到的调试工具就是SEGGER公司的Jlink仿真器,为什么是Jlink工具,天然的优势就是网上资料多,工具容易购买. 在Jlink升级到V9版本 ...

  5. php语法中可以输出调试信息,怎么优雅的输出PHP调试信息

    如何优雅的输出PHP调试信息 经常因为出现紧急bug而被老板骂的同事,为了更快的修复而直接利用线上的错误环境现场debug,并直接在页面上echo和dump.结果被老板发现了,又是一通臭骂.那么有没有 ...

  6. .Net Core新建解决方案,添加项目引用,使用VSCode调试

    .Net Core新建解决方案,添加项目引用,使用VSCode调试 参考文章: (1).Net Core新建解决方案,添加项目引用,使用VSCode调试 (2)https://www.cnblogs. ...

  7. vscode默认输出到调试控制台

    vscode配置中默认每次调试默认的配置是从终端输出,但这种方式输出的结果中,有很多我们并不需要的系统信息,而在调试控制台里只有简洁的我们想要的那部分信息. 要想默认输出到调试控制台,只需将launc ...

  8. 战舰V3适配oneos系列02:添加串口驱动

    战舰V3适配oneos系列02:添加串口驱动 参考: https://os.iot.10086.cn/v2/doc/detailPage/documentHtml?idss=1574615317503 ...

  9. 大彩串口屏与STM32G070CBT6通讯调试

    大彩串口屏与STM32G070CBT6通讯调试 1 大彩串口屏 1.1 指令格式和指令集 1.2 硬件连接与程序下载 2 串口屏例程移植到STM32G070CBT6 2.1 STM32CubeMX生成 ...

最新文章

  1. Parse error: syntax error, unexpected T_PUBLIC in 问题解决
  2. WinCE设置多国语言支持
  3. 实验8.1 指针与数组 6-6 数组循环右移
  4. 【言简意赅】四句话搞懂第一范式,第二范式,第三范式,以及BCNF
  5. 已知两点坐标拾取怎么操作_已知的操作员学习-第4部分
  6. codeforce C. Okabe and Boxes
  7. 计算机二级是报office还是vb,请问一下计算机二级中,高阶office好考,还是VB好考?...
  8. Zxing 的集成 ---- Maven 对应 Gradle 的写法
  9. Linux头文件引用小技巧
  10. 苹果Mac测试及维护工具:​​​​​​​​Techtool Pro
  11. Objective-C中内存管理的一些特例
  12. selnium 判断页面加载完成_selenium webdriver——等待页面元素加载完成
  13. 基于运放和三极管的恒流源电路
  14. 苏州新导蓝牙定位系统原理精确解读,三分钟看懂蓝牙定位
  15. 钉钉、企业微信平台发送工资条程序--燕春科技工资条管理系统2.0
  16. 2020icpc小米决赛K
  17. C/C++语言100题练习计划 84——分数线划定(结构体+快排函数)
  18. 【研一小白的白话理解】pytorch-CycleGAN-and-pix2pix
  19. python数据提取和合并_用Python提取和合并Excel数据
  20. 小旋风蜘蛛池X6.21去除授权站群+修复空白+弹窗

热门文章

  1. ListView详解 (ListView图文混排)
  2. 编程范式,程序员的编程世界观
  3. gdb调试之堆栈跟踪
  4. Python 数据结构视频教程一
  5. golang中的strings.SplitAfterN
  6. 常见排序算法时间复杂度
  7. 计算机网络:分组交换
  8. 字符串复制中的while条件
  9. a为数组名。sizeof(a)和sizeof(a)有什么区别?结果是?
  10. 设计模式:访问者模式(Visitor Pattern)