栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

一.对于串口的打印重定义和打印功能函数定义

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

一.对于串口的打印重定义和打印功能函数定义

一.串口1的打印重定义。

#pragma import(__use_no_semihosting)             
 //标准库需要的支持函数				  
 struct __FILE 
 { 
	 int handle; 
 }; 
 
 FILE __stdout; 	  
 //定义_sys_exit()以避免使用半主机模式	  
 void _sys_exit(int x) 
 { 
	 x = x; 
 } 
 //重定义fputc函数 
 int fputc(int ch, FILE *f)
 {	 
	 while((USART1->SR&0x40)==0);//循环发送,直到发送完毕	 
	 USART1->DR = (uint8_t) ch; 	 
	 return ch;
 }

二.打印功能:#include ”stdarg.h“

typedef struct _DOWNLOAD_PARA
{
//align
	uint32_t crc;
//align
	uint16_t magic;
	uint8_t  Res0[2];
//chip factory code
    uint8_t  sta_baudrate;
	uint8_t  sta_packet_len;
	uint8_t  sta_timeout;
	uint8_t  sta_ABarea;
	uint32_t printf_control;
	uint8_t  Res1[30];
}
DOWNLOAD_PARA;

DOWNLOAD_PARA DownLoad_Para_Info;

#define PRINT_BUF_SIZE  4200// 200// 100    //调试缓冲区大小
char szBuffer[PRINT_BUF_SIZE];

//串口打印控制
int console_write(int ch)
{
	HAL_UART_Transmit(&huart1,(u8*)&ch,1,5);
	return 0;
}
//输出打印重新封装
int putch_api(int ch)
{
	return console_write(ch);
}
//输出打印字符串数据
int puts_api(const char *s)
{
	while (*s != 0) {
		putch_api(*s++);
	}
	return 0;
}
//打印数据八进制
void print_oct_api(char ch2, unsigned long l)
{
	unsigned char ch;
	int i;

	ch2 = ch2 - '0';
	for (i = ch2 - 1; i >= 0; i--) {
		ch = (l >> (i * 4)) & 0x0f;
		if (ch < 10)
			putch_api(ch + '0');
		else
			putch_api(ch - 10 + 'A');
	}
}
//打印数据整型
void print_d_api(unsigned long l)
{
	unsigned long prod, t;
	int flag = 0;
	unsigned char ch;
	int i, j;

	for (i = 15; i >= 0; i--) {
		prod = 1;
		t = l;
		for (j = 0; j < i; j++) {
			prod = prod * 10;
			t = t / 10;
		}
		ch = t;
		l -= prod * t;

		if (ch == 0 && flag == 0)
			continue;

		if (ch < 10)
			putch_api(ch + '0');
		else
			putch_api('?');

		flag = 1;
	}
}
//打印数据16进制
void print_x_api(unsigned long l)
{
	int flag = 0;
	unsigned char ch;
	int i;

	for (i = 7; i >= 0; i--) 
	{
		
		ch = (l >> i)&0x0f;
		
		if(ch == 0 && flag == 0)
			continue;

		if (ch < 10)
		{
			putch_api(ch + '0');
		}
		else
		{
			putch_api(ch - 10 + 'A');
		}
		
		flag = 1;
	}
}
//数据数据函数
int printf_api(const char *s, ...)
{
	va_list ap;
	unsigned long arg;
	const char *str;
	char ch1, ch2, ch3;
	char lastch = 0;

	//Console_Print_Number = 0;
	//Console_Print_Input = 0;
	
	va_start(ap, s);
	//API_IO_WDI();
	while (*s != 0) 
	{
		if (*s == '%')
		{
			s++;
			ch1 = *s++;
			if (ch1 == 's')
			{
				str =(const char *) va_arg(ap, unsigned char *);
				puts_api(str);
			} 
			else if (ch1 == 'd') 
			{
				arg = va_arg(ap, unsigned long);
				print_d_api(arg);
			} 
			else if (ch1 == 'x')
			{
				arg = va_arg(ap, unsigned long);
				print_x_api(arg);
			} 
			else if (ch1 == 'n') 
			{
				putch_api(0x0d);
			} 
			else if (ch1 == 'r') 
			{
				putch_api(0x0a);								
			} 
			else if(ch1 == '')
			{
				break;
			} 
			else 
			{
				ch2 = *s++;
				ch3 = *s++;
				arg = va_arg(ap, unsigned long);
				if(ch2 >= '0' && ch2 <= '9' && ch3 != '')
				{
					print_0nx_api(ch2, arg);
				}
				else
				{
					break;
				}
			}
		} 
		else
		{
			ch1 = *s++;
			if (ch1 == 'r') 
			{
				putch_api(0x0d);
			}
			else if (ch1 == 'n') 
			{
				if(lastch != 'r')
				{
					putch_api(0x0d);
				}
				putch_api(0x0a);								
			} 
			else if(ch1 == '')
			{
				break;
			}
			else
			{
				putch_api(ch1);
			}
			lastch = ch1;
		}
	}
	va_end(ap);
	
	return 0;
}

//用于参数数据输出打印
void Trace(unsigned long print_en_flag,const  char* lpszFormat, ...)
{
	va_list args;
	int len;
	if(DownLoad_Para_Info.printf_control&print_en_flag)
	{
		va_start(args, lpszFormat);
		len = vsprintf(szBuffer, lpszFormat, args);
		va_end(args);
		if(len <  PRINT_BUF_SIZE - 2)
		{
			szBuffer[len] = '';
			printf_api(szBuffer);
		}
		else
		{
			szBuffer[PRINT_BUF_SIZE-3] = '';
			printf_api(szBuffer);
		}
	}
}
//打印数据16进制
void TraceHex(unsigned long print_en_flag,unsigned char *pBuf, unsigned short size)
{

	unsigned short i;	
	unsigned short print_size= 0;

	//if(print_en_flag&CCO_para.print_en_flag)
	{
		if(size == 0)
		{
			return;
		}
		print_size = size;
		
		if(print_size>(PRINT_BUF_SIZE-2))
		{
			print_size=(PRINT_BUF_SIZE-2);
		}
		
		for(i = 0; i < print_size; i++)
		{
			Trace(print_en_flag,"%02x ", pBuf[i]);
		}

		Trace(print_en_flag,"n");
	}

}
//打印数据,使能参数,数据,长度
void TraceHexExp(unsigned long print_en_flag,unsigned char *pBuf, unsigned short size)
{

	unsigned short i;	
	unsigned short print_size= 0;

	//if(print_en_flag&CCO_para.print_en_flag)
	{
		if(size == 0)
		{
			return;
		}
		print_size = size;
		
		if(print_size>(PRINT_BUF_SIZE-2))
		{
			print_size=(PRINT_BUF_SIZE-2);
		}
		
		for(i = 0; i < print_size; i++)
		{
			Trace(print_en_flag,"%02x ", pBuf[i]);
		}

	}

}

//打印数据
void TraceExp(const  char* lpszFormat, ...)
{

	va_list args;
	int len;

	va_start(args, lpszFormat);
	len = vsprintf(szBuffer, lpszFormat, args);
	va_end(args);
	if(len <  PRINT_BUF_SIZE - 2)
	{
		szBuffer[len] = '';
		printf_api(szBuffer);
	}
	else
	{
		szBuffer[PRINT_BUF_SIZE-3] = '';
		printf_api(szBuffer);
	}

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/675528.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号