添加串口和虚拟终端输出帮助调试

摘要:
使用串行端口或虚拟终端输出我们想要看到的信息是一种非常好且简单的方法。如果您想通过串行端口输入参数,您可能还需要使用中断。标准库中的printf函数实际上调用intfputc(intch)。如果要通过串行端口输入参数,还需要在IAR虚拟终端中查看输出结果。您只需要进行一些必要的设置,即可将标准输出重定向到IAR虚拟终端。如果在使用IAR虚拟终端时过载输入和输出函数

在使用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”。

添加串口和虚拟终端输出帮助调试第1张 

添加串口和虚拟终端输出帮助调试第2张 

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

 添加串口和虚拟终端输出帮助调试第3张

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

 添加串口和虚拟终端输出帮助调试第4张

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

添加串口和虚拟终端输出帮助调试第5张

如果在使用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[]="
The 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

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

免责声明:文章转载自《添加串口和虚拟终端输出帮助调试》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇winForm 打印预览Oracle中使用escape关键字实现like匹配特殊字符,以及&字符的转义下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

CLR寄宿(上) MSCOREE.DLL

CLR寄宿(上) MSCOREE.DLL托管代码调用非托管代码,.NET提供了P/Invoke(平台调用)方式,它作为.NET的基础出现在各类书籍和网络资源上,这里不再讨论。那么非托管代码如何去调用托管代码呢?我们知道,一个托管应用程序首先被操作系统启动,然后由操作系统调用CLR来托管该程序。那么.NET框架到底以什么方式让操作系统来认识它并且可以启动它呢...

Django 语法笔记

Django 语法创建项目框架 django-admin startproject 项目名 创建子app 业务分化,可以优化团队合作,可以明确找锅 python manage.py startapp 子app名 启动项目 python manage.py runserver 项目目录结构 __init__.py: 声明当前文件夹为一个可导入的包 se...

VC中Spin控件的使用

微调按钮设置成set buddy inter选上 然后可以(1)通过 setbuddy+setrange函数    或(2)auto buddy自动选上,只要编辑框的tab order 比微调按钮小1就可以自动了 (另转)VC中Spin控件的使用 http://leichaofu.blog.163.com/blog/static/459481820098...

LIS系统通讯程序原理与实现

LIS系统通讯程序原理与实现 一、BSLIS仪器数据采集方法BSLIS对检验仪器的数据采集主要通过串行口通讯、USB端口通讯、TCP/IP通讯、定时监控数据库和手工录入等几种方法。串行口通讯最为普遍,采用RS-232C标准,一般的仪器都支持此标准。定时监控数据库对仪器管理机上已有的检验信息数据定时直接进行读取,而后转发到BSLIS系统,一般在国产仪器中较常...

PL2303 Windows8.1驱动

常用的USB转串口下载芯片驱动可以参照我这篇文章USB转串口 FT232/PL2303/CH340 驱动以及使用体会 ,今天有找出了那根串口线打算使用,由于系统已经换为Windows8.1 X64所以又去官网找驱动去了,一看悲剧了。官方信息如下: PL2303 Windows Driver Download Download File:PL2303_P...

在ubuntu下利用minicom实现串口通信

    windos有串口调试助手,linux下也有这样的工具——minicom。不过,minicom和linux下的许多工具都一样,也是命令行模式,没有图形化界面供我们享受。作为一款串口调试工具,虽然难看但总比没有的好。     为什么linux下的工具都这么的简朴,没什么华丽的界面,好像回到了解放前。一种可能的原因是linux这种非商业性质的软件,都是...