目錄
如何實現多個串口重定義實現printf輸出,在STM32中?
工程代碼:
#include "stdarg.h" //包含需要的頭文件
#define USART1_TXBUFF_SIZE 256 //定義串口3發送緩衝區大小 256字節
__align(8) char Usart3_TxBuff[USART1_TXBUFF_SIZE];//串口3緩存區
#if 1
//串口1
int fputc(int ch, FILE *s)
{
/* 阻塞判斷串口是否發送完成 */
while((USART1->ISR & 0X40) == 0);
/* 串口發送完成,將該字符發送 */
USART1->TDR = (uint8_t) ch;
return ch;
}
#endif
//串口3,AT指令發送端口,操作wifi
void u3_printf(char* fmt,...)
{
unsigned int i,length;
va_list ap;
//va_list 可變參數列表,存參數地址
va_start(ap,fmt);//獲取可變參數地址 fmt地址賦給ap
vsprintf(Usart3_TxBuff,fmt,ap);/*使用參數列表發送格式化輸出到字符串,
函數功能將可變參數格式化輸出到一個字符數組
*/
//fmt中內容賦給Usart3_TxBuff,
va_end(ap); //清空參數列表
//
length=strlen((const char*)Usart3_TxBuff);
while((USART3->ISR&0X40)==0);
for(i = 0;i < length;i ++)
{
USART3->TDR = Usart3_TxBuff[i];
while((USART3->ISR&0X40)==0);
}
}
代碼分析:
可變參數:c語言可變參數輸出
va_list ap;
//va_list 可變參數列表,存參數地址
va_start(ap,fmt);//獲取可變參數地址 fmt地址賦給ap
vsprintf(Usart3_TxBuff,fmt,ap);/*使用參數列表發送格式化輸出到字符串,
函數功能將可變參數格式化輸出到一個字符數組
*/
//fmt中內容賦給Usart3_TxBuff,
va_end(ap); //清空參數列表
把可變參數地址存到ap中,存儲圖如下。
函數形式參數存儲:
void func(char * parameter0,char * parameter1,char * parameter2,char * parameter3){
}
棧向下生長,先入後出。