本帖最后由 与龙共舞 于 2018-4-27 14:57 编辑
问题引入:上位机C编程,第一句一般是printf你好世界到终端,而下位机没有终端,一般就是串口了。
串口输出并不困难,本文第一步也就是再次完成这个实验。
而格式化输出就要想办法了,比如刘洋说的三个步骤是Keil打钩用编译器来帮助。本文第二部分就是自己用库函数来实现。
第一步:串口输出
没有文字介绍了,挺容易的吧。
PC找一个USB--TTL的CH340
TX RX GND和板子的3个对应连接。
就可以看到实验效果。
第一步:串口格式化输出
为了方便移植,我们自己做一个模块。
logger.c
logger.h
最后主函数如下。
也就是要从
HAL_UART_Transmit(&huart1, (uint8_t *)Buffer, 10,0xFFFF);
升级到
logUsart("%d\t++++%s\n",a,s);
下面开始实行这个模块。
直接放代码
- #ifndef _LOGGER_H_
- #define _LOGGER_H_
- #include "stm32f1xx_hal.h"
- extern void logUsartInit(UART_HandleTypeDef *husart);
- extern int logUsart(const char* format, ...);
- #endif
复制代码- #include "logger.h"
- #include <string.h>
- #include <stdarg.h>
- typedef unsigned char uint8_t;
-
- #define MAX_HEX_STR 4
- #define MAX_HEX_STR_LENGTH 128
- char hexStr[MAX_HEX_STR][MAX_HEX_STR_LENGTH];
- uint8_t hexStrIdx = 0;
- #define USART_TIMEOUT 1000
- UART_HandleTypeDef *pLogUsart = 0;
- uint8_t logUsartTx(uint8_t *data, int dataLen);
- void logUsartInit(UART_HandleTypeDef *husart)
- {
- pLogUsart = husart;
- }
- uint8_t logUsartTx(uint8_t *data, int dataLen)
- {
- if(pLogUsart == 0)
- return 0;
- return HAL_UART_Transmit(pLogUsart, data, dataLen, USART_TIMEOUT);
- }
- int logUsart(const char* format, ...)
- {
- #define LOG_BUFFER_SIZE 256
- char buf[LOG_BUFFER_SIZE];
- va_list argptr;
- va_start(argptr, format);
- int cnt = vsnprintf(buf, LOG_BUFFER_SIZE, format, argptr);
- va_end(argptr);
- logUsartTx((uint8_t*)buf, strlen(buf));
- return cnt;
- }
复制代码 效果如下
初始化是 挂钩你需要debug的串口。
格式化的核心是如下几句话:
va_list argptr;
va_start(argptr, format);
int cnt = vsnprintf(buf, LOG_BUFFER_SIZE, format, argptr);
va_end(argptr);
++++参考ST开发板代码+++
附近是即插即用的模块。
注意:在头文件中#include 不合理 会有很多错误!
|
哦 那要做一个开关 正式版本程序把logger关闭
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
* @brief Retargets the C library printf function to the USART.
* @param None
* @retval None
*/
PUTCHAR_PROTOTYPE
{
USART_SendData(USART1,ch);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
{}
return ch;
}