我使用sprintf()來填充一個緩沖區,然后通過UART發送這個緩沖區。
我關注了很多sprintf的例子和用例,但我的代碼似乎并不作業
以下是我的代碼例子:
#include "stdio.h"
#include "usart.h"
#define Uart husart1
int main(void)
{
uint32_t m = 3;
char c = 'A'/span>;
uint32_t o = 1;
char buffer[256] 。
sprintf(buffer, "AT ,%lu,%c,%lu
", m, c, o)。)
HAL_UART_Transmit(&Uart, (uint8_t*) buffer, strlen(buffer), 1000) 。
通過這段代碼,我的輸出是AT ,lu,,lu
你知道是什么地方出了問題嗎?
編輯1。
當我用%lu替換%d時,我的編譯器出現了這個錯誤 :
format '%d'期望引數型別為'int'。但是引數5的型別是'uint32_t {aka long unsigned int}' [-Wformat=]
所以我有%ld,緩沖區的發送就像AT ,ld,,ld
編輯2:
當我用%u替換%lu時,我的編譯器出現了這個錯誤 :
format '%u'期望引數型別為'unsigned int'。但是引數3的型別是'uint32_t {aka long unsigned int}' [-Wformat=]
編輯3。
用#include <stdio.h>,我有同樣的錯誤
編輯4:關于答案,我想保留uint32_t,因為我的AT引數可以是32位長的
編輯5。 我試著用%d和(int16_t)來鑄造型別,如下:
sprintf(buffer, "AT , %d,%c,%d
", (int16_t) m, c, (int16_t) o) 。
而這次我的結果是"AT , ,A,"
為什么我的代碼會對有符號或無符號的整數感到不安?
編輯6:
使用inttypes.h,看起來是這樣的:
sprintf(buffer, "AT ,%"/span>PRIu32", %c,%"/span>PRIu32"
", m, c, o)。
而我的輸出仍然看起來像AT ,lu,,lu
uj5u.com熱心網友回復:
嵌入式目標通常使用標準庫的nano實作,它不支持許多printf格式。
簡單地使用%u來表示uint32_t,因為uint32_t是STM32 uCs的原始整數大小。
如果你想非常非常 "符合要求 "的話,請添加到unsigned int。
uj5u.com熱心網友回復:
uint32_t的正確格式說明是在定義宏PRIu32中,它擴展為正確的格式說明字串。它可以在inttypes.h中找到。所以你的代碼變成了這樣(也固定了include括號,假設這些頭檔案都不是你專案的一部分,而是工具鏈的一部分):
#include <stdio.h>/span>
#include <inttypes.h>
#include <usart.h>
#define Uart husart1
int main(void)
{
uint32_t m = 3;
char c = 'A'/span>;
uint32_t o = 1;
char buffer[256] 。
sprintf(buffer, "AT ,%"/span>PRIu32",%c,%"/span>PRIu32"
", m, c, o)。)
HAL_UART_Transmit(&Uart, (uint8_t*) buffer, strlen(buffer), 1000) 。
這些宏可能看起來有點混亂,所以解釋一下。在C語言中,你可以在編譯時將字串字頭連接起來,只需將它們一個接一個。換句話說,"count is %" "lu" " items"產生的字串字面與"count is %lu items"完全相同。而inttypes.h包含一個定義,如#define PRIu32 "u"或任何平臺上的正確格式。
參考鏈接。https://en.cppreference.com/w/c/types/integer
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/334258.html
標籤:
