控制台的三种连接方式:

  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[])),
.command_list = &g_sf_console_commands[]
}; /***********************************************************************************************************************
* 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[], &level); /* Invert level */
g_ioport.p_api->pinWrite(leds.p_leds[], (ioport_level_t)!level);
} /* Test Thread entry function */
void g_testThread_entry(void)
{
/* TODO: add your own code here */
while ()
{
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[];
uint8_t u8Len;
va_list args; memset(str,,);
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, , pFmt, args);
va_end(args); if (u8Len > )
{
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

USB CDC & 可变形参的更多相关文章

  1. ATMEL处理器自带USB CDC的Win7驱动问题

    [背景] 很久以前使用ATMEL的处理器开发了一款设备,通过处理器本身的功能,借助USB在PC端虚拟一个串口出来,实现和上位机软件的通信,和基本的参数设置和数据读取功能. 这个功能就是ATMEL官网上 ...

  2. android的USB MTP && USB CDC/USBnet(ECM, NCM, ACM) && USB gardget

    MTP的全称是Media Transfer Protocol(媒体传输协议),它是微软公司提出的一套媒体文件传输协议.早在智能手机普及前,数码相机和MP3播放器等都使用了MTP的前身PTP(Pictu ...

  3. C语言中可变形参简单实例

    以下程序主要包括三个主要函数: 一个最简单的可变形参函数实例: 一个简单的printf功能的实例: 一个打印字符串函数(辅助): 其中myPrintf函数,实现了printf的部分简单功能,并没有去实 ...

  4. 关于函数传参的其他问题(const形参实参/可变形参)

    const 形参和实参 当形参是 const 变量时,实参是 const 或者不是 const 变量都可以. 实参初始化形参时会忽略掉顶层 const: void gel(const int a){ ...

  5. PIC24 通过USB在线升级 -- USB CDC bootloader

    了解bootloader的实现,请加QQ: 1273623966 (验证填bootloader):欢迎咨询或定制bootloader:我的博客主页www.cnblogs.com/geekygeek 今 ...

  6. PIC32MZ 通过USB在线升级 -- USB CDC bootloader

    了解bootloader 的实现,请加QQ: 1273623966 (验证填 bootloader):欢迎咨询或定制bootloader:我的博客主页www.cnblogs.com/geekygeek ...

  7. Java 类的重载/匿名类的使用/可变形参

    /** *1.类的方法的重载 *2.匿名类对象的传递和引用 *3.可变个数的形参(格式:1/对于方法的形参: 数据类型...形参名 * 2/可变个数的形参与同名的方法之间构成重载 * 3/可变个数的形 ...

  8. 可变形参 Day07

    package com.sxt.kebianxingcan; /* * 可变形参 * 声明:数据类型...标识符 * 作用:将实参作为数组处理 * 规则:一个方法只能有一个可变形参并且作为最后一个形参 ...

  9. USB CDC类

    现代嵌入式系统中,异步串行通信接口往往作为标准外设出现在单片机和嵌入式系统中.但是随着个人计算机通用外围设备越来越少地使用串口,串口正在逐渐从个人计算机特别是便携式电脑上消失.于是嵌入式开发人员常常发 ...

随机推荐

  1. unicode和utf8

    很多人,即使是有一些项目经验的人,都说过这句话.但是如果深入的理解什么是unicode之后就会知道,原来我们经常说的这句话“unicode字符是2个字节”这句话是有问题的. 要说清楚这个问题,首先就要 ...

  2. HDU 4783 Clumsy Algorithm

    题意不提. 我们可以发现,可以将最终序列分为对于第i个位置i-pi>=0与i-pi<0种两个子序列.且如果f[n]==g[n],则有两个子序列都递增. 原因是f[n]表示1-n这个排列的逆 ...

  3. 恢复性训练day1

    DP: 0/1背包一个常见的错误是没有cmax(f[i][j],f[i-1][j]) 0/1背包的拓展中有转移式的变形,以及无限数量背包,分组背包等. 可化为背包问题的一般不会太难. 数组开小,出现大 ...

  4. Kubernetes Resource Qoutas

    配置参数: spec.containers[].resources.limits.cpu spec.containers[].resources.limits.memory spec.containe ...

  5. linux运维面试题1

    一.填空题 1. 在Linux 系统 中,以文件方式访问设备 . 2. Linux 内核引导时,从文件/etc/fstab中读取要加载的文件系统 . 3. Linux 文件系统中每个文件用indoe节 ...

  6. netty上手

    关于netty的基础NIO,请参见:NIO原理及实例 下面介绍Netty的上手使用: 首先为项目添加jar依赖: <dependency> <groupId>io.netty& ...

  7. sqlserver的疑难杂症解析

    1.电脑修改ip后ssms通过ip访问失败 通过计算机名可以访问成功,但通过修改后的ip访问却失败了! 解决方法:打开Sql Server Configuration Manager -> SQ ...

  8. Redis源码分析:serverCron - redis源码笔记

    [redis源码分析]http://blog.csdn.net/column/details/redis-source.html   Redis源代码重要目录 dict.c:也是很重要的两个文件,主要 ...

  9. 02-大鸭梨博客系统数据库设计及Dapper的使用

    毫无疑问,数据库的设计在一个系统中起了至关重要的作用.我们都知道,系统设计分为两部分,或者说是两个阶段,即数据库设计和功能设计.构建一个完善的系统需要这两个阶段的充分考量.周密设计.合理联接以及密切配 ...

  10. sorket is closed

    今早来公司启动项目时,发现在代码正确的情况下报了一个错. 15:19:14.362 [http-9000-2] ERROR com.nari.osp.servicebus.rmi.LongConnec ...