当前位置: 首页 > news >正文

printf实现

这是我看之前公司的旧代码摘录下来的, 感觉写的还算可以吧,  

void printfsend(UART_TypeDef UARTx, uint8_t *buf, int len)
{uint8_t printbuf[256];for (int i = 0; i < len; i++){printbuf[i] = buf[i];}#ifdef ENABLE_PERIAL_TESTif (uart_printf_switch_gloab){UART_SendBuf(UART1, printbuf, len);}else{UART_SendBuf(UART0, printbuf, len);}
#elseUART_SendBuf(UARTx, printbuf, len);
#endif
}

 

void MyPrintf(char *format, ...)
{uint32_t ulIdx, ulValue, ulPos, ulCount, ulBase, ulNeg;int8_t *pcStr, pcBuf[16], cFill;char HexFormat;va_list vaArgP;va_start(vaArgP, format);while (*format){// Find the first non-% character, or the end of the string.for (ulIdx = 0; (format[ulIdx] != '%') && (format[ulIdx] != '\0'); ulIdx++){}// Write this portion of the string.if (ulIdx > 0){
//				printfsend(UART0,format, ulIdx);printfsend(UART0, (uint8_t *)format, ulIdx);}format += ulIdx;if (*format == '%'){format++;// Set the digit count to zero, and the fill character to space// (i.e. to the defaults).ulCount = 0;cFill = ' ';again:switch (*format++){case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':{if ((format[-1] == '0') && (ulCount == 0)){cFill = '0';}ulCount *= 10;ulCount += format[-1] - '0';goto again;}case 'c':{ulValue = va_arg(vaArgP, unsigned long);
//					printfsend(UART0,(char *)&ulValue, 1);printfsend(UART0, (uint8_t *)&ulValue, 1);break;}case 'd':{ulValue = va_arg(vaArgP, unsigned long);ulPos = 0;if ((long)ulValue < 0){ulValue = -(long)ulValue;ulNeg = 1;}else{ulNeg = 0;}ulBase = 10;goto convert;}case 's':{
//					pcStr = va_arg(vaArgP, char *);pcStr = (int8_t *)va_arg(vaArgP, char *);for (ulIdx = 0; pcStr[ulIdx] != '\0'; ulIdx++){}//					printfsend(UART0,pcStr, ulIdx);printfsend(UART0, (uint8_t *)pcStr, ulIdx);if (ulCount > ulIdx){ulCount -= ulIdx;while (ulCount--){
//							printfsend(UART0, " ", 1);printfsend(UART0, (uint8_t *)" ", 1);}}break;}case 'u':{ulValue = va_arg(vaArgP, unsigned long);ulPos = 0;ulBase = 10;ulNeg = 0;goto convert;}case 'X':{ulValue = va_arg(vaArgP, unsigned long);ulPos = 0;ulBase = 16;ulNeg = 0;HexFormat = 'X';goto convert;}case 'x':case 'p':{ulValue = va_arg(vaArgP, unsigned long);ulPos = 0;ulBase = 16;ulNeg = 0;HexFormat = 'x';convert:for (ulIdx = 1;(((ulIdx * ulBase) <= ulValue) &&(((ulIdx * ulBase) / ulBase) == ulIdx));ulIdx *= ulBase, ulCount--){}if (ulNeg){ulCount--;}if (ulNeg && (cFill == '0')){pcBuf[ulPos++] = '-';ulNeg = 0;}if ((ulCount > 1) && (ulCount < 16)){for (ulCount--; ulCount; ulCount--){pcBuf[ulPos++] = cFill;}}if (ulNeg){pcBuf[ulPos++] = '-';}for (; ulIdx; ulIdx /= ulBase){if (HexFormat == 'x')pcBuf[ulPos++] = g_pcHex1[(ulValue / ulIdx) % ulBase];//xelsepcBuf[ulPos++] = g_pcHex2[(ulValue / ulIdx) % ulBase];//X}//					printfsend(UART0, pcBuf, ulPos);printfsend(UART0, (uint8_t *)pcBuf, ulPos);break;}case '%':{
//					printfsend(UART0, format - 1, 1);printfsend(UART0, (uint8_t *)format - 1, 1);break;}default:{
//					printfsend(UART0, "ERROR", 5);printfsend(UART0, (uint8_t *)"ERROR", 5);break;}}//switch}//if}//whileva_end(vaArgP);
}

http://www.lryc.cn/news/287040.html

相关文章:

  • Elasticsearch 中的 term、terms 和 match 查询
  • 美易官方:开盘:美股高开科技股领涨 标普指数创盘中新高
  • STM32F407移植OpenHarmony笔记2
  • 数据仓库-相关概念
  • 线程的面试八股
  • Jmeter 配置元件
  • Java- @FunctionalInterface声明一个接口为函数式接口
  • Java使用Netty实现端口转发Http代理Sock5代理服务器
  • Linux环境docker安装Neo4j,以及Neo4j新手入门教学(超详细版本)
  • C++ inline 关键字有什么做用?
  • eNSP学习——理解ARP及Proxy ARP
  • Unity中UGUI在Mask剪裁粒子特效的实现
  • 精通 VS 调试技巧,学习与工作效率翻倍!
  • yarn 安装包时报“certificate has expired”
  • Qt5项目拆解第一集解决:中文乱码| 全局字体|注册表|QSS/CSS
  • 消息队列RabbitMQ.01.安装部署与基本使用
  • 1.24号c++
  • 【GitHub项目推荐--12 年历史的 PDF 工具开源了】【转载】
  • React16源码: React中的PortalComponent创建, 调和, 更新的源码实现
  • Hive-SQL语法大全
  • 编译原理2.3习题 语法制导分析[C++]
  • JUC-CAS
  • Effective C++——关于重载赋值运算
  • vscode debug
  • 数据库选型其实技术维度不太重要
  • 【C++】入门(二)
  • Nginx 代理服务路径带/和不带/的问题
  • C# CefSharp 输入内容,点击按钮,并且滑动。
  • 历经15年,比特币以强势姿态进军华尔街!270亿美元投资狂潮引发市场震荡!
  • GBASE南大通用的接口程序GBase ADO.NET