@ คำตอบของ AdamHaun คือทุกสิ่งที่คุณต้องการsprintf()
เพราะมันง่ายที่จะสร้างสตริงแล้วส่งมัน แต่ถ้าคุณต้องการprintf()
ฟังก์ชั่นของคุณเองฟังก์ชั่นอาร์กิวเมนต์ของตัวแปร (va_list)ก็เป็นวิธีที่ดี
ด้วยva_list
ฟังก์ชั่นการพิมพ์แบบกำหนดเองมีลักษณะดังต่อไปนี้:
#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);
}
ตัวอย่างการใช้งาน:
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);
โปรดทราบว่าในขณะที่โซลูชันนี้ให้คุณใช้งานได้สะดวก แต่มันช้ากว่าการส่งข้อมูลดิบหรือใช้งานแบบsprintf()
สม่ำเสมอ ด้วยผู้มีเกียรติสูงฉันคิดว่ามันคงไม่เพียงพอ
ตัวเลือกอื่นและตัวเลือกที่น่าจะดีกว่าคือการใช้ ST-Link, SWD debugger พร้อมกับ ST-Link Utility และใช้Printf ผ่านทางโปรแกรมดู SWOนี่คือคู่มือของST-Link Utilityส่วนที่เกี่ยวข้องเริ่มต้นในหน้า 31
Printf ผ่านทาง SWO Viewer จะแสดงข้อมูล printf ที่ส่งจากเป้าหมายผ่านทาง SWO อนุญาตให้แสดงข้อมูลที่เป็นประโยชน์บางอย่างเกี่ยวกับการใช้งานเฟิร์มแวร์