网站开发 项目式说课企业网站不备案
web/
2025/9/30 10:07:29/
文章来源:
网站开发 项目式说课,企业网站不备案,猎头公司好做吗,宁夏建设工程造价信息网#xfeff;#xfeff;在使用IAR开发STM32项目时#xff0c;使用串口或者是虚拟终端来输出我们想看的信息是一个非常好而且简便的方式。
首先来看看串口怎么实现信息输出。简单来说串口输出信息就是将标准输出重定向到串口#xff0c;在上位机的超级终端或者串口助手等工…在使用IAR开发STM32项目时使用串口或者是虚拟终端来输出我们想看的信息是一个非常好而且简便的方式。
首先来看看串口怎么实现信息输出。简单来说串口输出信息就是将标准输出重定向到串口在上位机的超级终端或者串口助手等工具中查看结果。
在使用串口之前要配置串口这一点是串口应用的基本知识如果要通过串口输入参数可能还需要使用中断。关于串口配置和终端配置应根据具体是用来实现。这里主要说一下标准输出的重定向。
标准库中的printf函数实际调用了intfputc(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界面后在左侧列表框中选择“GeneralOptions”在右侧的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{PrintTypeprintType;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)chartitle[]\nThe result is:;PrintObjectprintObject[]{{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
如此就可以非常方便的输出信息、并可根据自己的需要控制是否输出调试信息采用何种信息输出方式了对调试来说非常有帮助。
欢迎关注
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/84401.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!