控制台的三种连接方式:

  1、IP网络

  2、USB

  3、UART

  

一:介绍USB CDC方式:

  

1、控制台配置如下:

  

2、USB

    Product ID 可以是:0x0000/0x5300/0x0238

    不同的值代表不同的COM口

  

3、CDC配置

  

二:介绍UART配置:

  

  注意UART配置通道、波特率以及中断优先级,如下:

  

#include "g_testThread.h"void led_toggle_callback(sf_console_cb_args_t * p_args);const sf_console_command_t g_sf_console_commands[] =
{{ .command = (uint8_t *)"TOGGLE",              //CMD.help = (uint8_t *)"Toggle an LED",.callback = led_toggle_callback,             //控制台命令回调.context =  NULL},{.command  = (uint8_t *)"cell",.help     = (uint8_t *)"Cell Provisioning info to be saved\r\n""             Usage:\r\n""               cell <APN> <Context ID> <PDP Type>",.callback = led_toggle_callback,.context  = NULL},
};/* 1. Create Menu Structure */
const sf_console_menu_t g_sf_console_root_menu =
{.menu_prev = NULL,.menu_name = (uint8_t *)"Command",.num_commands = (sizeof(g_sf_console_commands)) / (sizeof(g_sf_console_commands[0])),.command_list = &g_sf_console_commands[0]
};/***********************************************************************************************************************
* Function Name: led_toggle_callback
* Description  : Implement Callbacks
*                   Callback function provided to g_sf_console_commands[0]. Function is invoked when user inputs
*                   TOGGLE<CR> in the Console
* Arguments    : p_args -
*                   Pointer to an instance type sf_console_cb_args_t
* Return Value : None
***********************************************************************************************************************/
void led_toggle_callback(sf_console_cb_args_t * p_args)
{bsp_leds_t leds;ioport_level_t level;/* Get LED list from BSP */R_BSP_LedsGet(&leds);/* Read current level */g_ioport.p_api->pinRead(leds.p_leds[0], &level);/* Invert level */g_ioport.p_api->pinWrite(leds.p_leds[0], (ioport_level_t)!level);
}/* Test Thread entry function */
void g_testThread_entry(void)
{/* TODO: add your own code here */while (1){g_sf_console0.p_api->prompt(g_sf_console0.p_ctrl, NULL, TX_WAIT_FOREVER);//TX_WAIT_FOREVER//TX_NO_WAIT//tx_thread_sleep (50);
    }
}

测试如下:

  控制台支持CMD:  

    “TOGGLE”

    “CELL”

    “?”

    “?”:为帮助信息

    

可变形参:

  1、_vsnprintf,_vsnprintf是C库函数之一,属于可变参数。用于向字符串中打印数据、数据格式用户自定义。头文件是#include <stdarg.h>。

头文件:
#include <stdarg.h>
函数声明:
int _vsnprintf(char* str, size_t size, const char* format, va_list ap);
  1. char *str [out],把生成的格式化的字符串存放在这里.
  2. size_t size [in], str可接受的最大字符数 [1]  (非字节数,UNICODE一个字符两个字节),防止产生数组越界.
  3. const char *format [in], 指定输出格式的字符串,它决定了你需要提供的可变参数的类型、个数和顺序。
  4. va_list ap [in], va_list变量. va:variable-argument:可变参数
函数功能:将可变参数格式化输出到一个字符数组。
用法类似于vsprintf,不过加了size的限制,防止了内存溢出(size为str所指的存储空间的大小)。
返回值:执行成功,返回最终生成字符串的长度,若生成字符串的长度大于size,则将字符串的前size个字符复制到str,同时将原串的长度返回(不包含终止符);执行失败,返回负值,并置errno. [2] 
  2、va_star

va_start,函数名称,读取可变参数的过程其实就是在堆栈中,使用指针,遍历堆栈段中的参数列表,从低地址到高地址一个一个地把参数内容读出来的过程·
具备了上述两个API,可变形参到控制台如下:
void print_to_console(const char *pFmt, ...)
{UINT status;char str[128];uint8_t u8Len;va_list args;memset(str,0,128);status = tx_mutex_get(&g_console_print_mutex, TX_WAIT_FOREVER);if (status != TX_SUCCESS)return;va_start(args, pFmt);u8Len = (uint8_t)vsnprintf(str, 128, pFmt, args);va_end(args);if (u8Len > 0){g_sf_console0.p_api->write(g_sf_console0.p_ctrl, (const uint8_t *)str, TX_WAIT_FOREVER);}tx_mutex_put(&g_console_print_mutex);
}

如使用宏实现:

//#define SEMI_HOSTING

#ifdef SEMI_HOSTING
#ifdef __GNUC__
extern void initialise_monitor_handles (void);
#endif
#endif#ifdef SEMI_HOSTING
#define xp_log(format, args...)             printf(format, ##args)
#else
#define xp_log(format, args...)             print_to_console(format, ##args)
#endif

转载于:https://www.cnblogs.com/jiangzhaowei/p/8982172.html

USB CDC 可变形参相关推荐

  1. stm32f407 usb cdc设备无法启动问题

    最新要做一个项目,要求基于STM32F407实现USB CDC设备,首先想到的就是直接用STM32CUBEMX工具来生成,OK,话不多说,直接上过程: RCC配置: Sys配置 USB_OTG_FS配 ...

  2. IOS之学习笔记六(可变形参)

    1.实现函数的可变形参 1).va_list:这是一个可变类型,用于定义指向可变参数列表的指针变量 2).va_start:让argList指向一个可变参数列表的第一个参数 3).提取argList当 ...

  3. GD32F3x0 USB CDC应用案例

    GD32F3x0 USB CDC应用 本文有点长,描述了从0开始移植驱动到应用的过程和思路 准备工作: 因项目需求这两天需要做个USB的虚拟COM口发卡器,实现双向通讯,由于功能较为简单我们选择GD3 ...

  4. 在进行USB CDC类开发时,无法发送64整数倍的数据(续)

    1 前言 此文延续之前相同文章的话题,是对上篇文章的补充,之所以会有此文,主要是之前发现问题是在STM32F4上,解决方案也是基于CubeF4,但是,当相同问题出现在STM32F0上时,使用之前的代码 ...

  5. 在进行USB CDC类开发时,无法发送64整数倍的数据

    1 前言 本文将基于STM32F4DISCOVERY板,介绍如何使用USB的CDC类进行开发,以及在开发过程中碰到发送64整数倍数据时会失败的问题分析及解决方案. 2 硬件介绍 在创建工程之前,我们首 ...

  6. TI CC2540 USB CDC Serial Port驱动安装失败原因及解决方法

    TI CC2540 USB CDC Serial Port驱动安装失败原因及解决方法 参考文章: (1)TI CC2540 USB CDC Serial Port驱动安装失败原因及解决方法 (2)ht ...

  7. USB CDC从理论到实践

    本文摘自ST官网的"USB CDC类入门培训".整理的内容是我能够看得懂的,认为比较实用的,记录下来,以便以后查阅,同时也把原文档中的笔误给更正了一下.若要看更详细的可以去ST技术 ...

  8. USB CDC 4G Module 调试问题总结

    USB CDC 4G Module ESP32S2 自定义开发板 SIM7600C1 其他按照github USB CDC 4G Module 使用说明 确保硬件正确SIM卡正常 编译注意做好在4.4 ...

  9. 关于JAVA中的可变形参(多个参数)

    说到可变参数,要先说一下函数的重载, 重载:函数名称,修饰符,返回值都一样,只有变量的个数,变量的类型不一样,才叫重载. 比如说声明一个类,People,对该类中的getNum()方法进行重载,如下图 ...

最新文章

  1. Flask 教程 第十三章:国际化和本地化
  2. 计算几个数相加和为16
  3. java版b2b2c社交电商springcloud分布式微服务 (九)服务链路追踪(Spring Cloud Sleuth)...
  4. 03-spring bean
  5. Android内核开发:学会分析系统的启动log
  6. 1.MySQL的安装(linux Ubuntu环境下)
  7. 又一国产开源微内核操作系统上线!源代码已开放下载
  8. Qt+OpenCV打开视频文件并在窗口界面上显示
  9. 【转】Azure 命令行工具大混战,都是什么,该选哪个?
  10. 信息奥赛一本通(1100:金币)
  11. 用Docker搭建Laravel开发环境
  12. 《Python入门到精通》流程控制语句
  13. 数据库设计中的14个技巧(转载)
  14. Safari中的代理设置(在【偏好设置中】)。
  15. TensorFlow安装中遇到的问题
  16. Swift 2.0 自定义cell和不同风格的cell
  17. 看看!挺动人的故事!!!
  18. 《java深度历险》--王森
  19. c语言flappy bird编程,C语言实现Flappy Bird小游戏
  20. 如何制作生成GIF?手把手教你生成GIF动态图

热门文章

  1. miniui 加载文件时会做的一些事情
  2. 【linux 06】 linux中的用户权限、文件权限与目录权限
  3. STL 二分查找 upper_bound和lower_bound用法
  4. 把docker当做绿色打包工具
  5. 关于equals和hashcode方法
  6. fatal error RC1004: unexpected end of file found处理方法
  7. FAILED BINDER TRANSACTION
  8. Linux的权限管理 1
  9. 微服务实践:全栈小团队“洪荒之力”改造阿里服务CRM技术体系
  10. JavaEE PO VO BO DTO POJO DAO 整理总结