Câu trả lời của @ AdamHaun là tất cả những gì bạn cần, sprintf()
thật dễ dàng để tạo một chuỗi và sau đó gửi nó. Nhưng nếu bạn thực sự muốn một printf()
hàm của riêng mình, thì Hàm đối số biến (va_list) là cách.
Với va_list
chức năng in tùy chỉnh trông như sau:
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
void vprint(const char *fmt, va_list argp)
{
char string[200];
if(0 < vsprintf(string,fmt,argp)) // build string
{
HAL_UART_Transmit(&huart1, (uint8_t*)string, strlen(string), 0xffffff); // send message via UART
}
}
void my_printf(const char *fmt, ...) // custom printf() function
{
va_list argp;
va_start(argp, fmt);
vprint(fmt, argp);
va_end(argp);
}
Ví dụ sử dụng:
uint16_t year = 2015;
uint8_t month = 12;
uint8_t day = 18;
char* date = "date";
// "Today's date: 2015-12-18"
my_printf("Today's %s: %d-%d-%d\r\n", date, year, month, day);
Lưu ý rằng mặc dù giải pháp này cung cấp cho bạn chức năng thuận tiện để sử dụng, nhưng nó chậm hơn gửi dữ liệu thô hoặc sử dụng chẵn sprintf()
. Với các cơ sở dữ liệu cao, tôi nghĩ rằng nó sẽ không đủ.
Một tùy chọn khác và có lẽ là tùy chọn tốt hơn là sử dụng trình gỡ lỗi ST-Link, SWD cùng với ST-Link Utility. Và sử dụng Printf thông qua trình xem SWO , đây là hướng dẫn của ST-Link Utility , phần có liên quan bắt đầu từ trang 31.
Printf qua SWO Viewer hiển thị dữ liệu printf được gửi từ mục tiêu thông qua SWO. Nó cho phép hiển thị một số thông tin hữu ích trên firmware đang chạy.