发新帖我要提问
12
返回列表
打印
[应用相关]

一种STM32的串口控制台的实现(非常实用)

[复制链接]
楼主: 八层楼
手机看帖
扫描二维码
随时随地手机跟帖
21
八层楼|  楼主 | 2019-7-6 12:48 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
/******************************************************************************
/ 函数功能:打开LED信号
/ 修改日期:none
/ 输入参数:none
/ 输出参数:none
/ 使用说明:none
******************************************************************************/
void Ledx_on(uint16_t msg_id)
{
  #if (SHELL_LED_MAX > 0)
    if(msg_id == msg_led_cfg[0])LED0_ON();
  #endif
  #if (SHELL_LED_MAX > 1)
    if(msg_id == msg_led_cfg[1])LED1_ON();
  #endif
  #if (SHELL_LED_MAX > 2)
    if(msg_id == msg_led_cfg[2])LED2_ON();
  #endif
  #if (SHELL_LED_MAX > 3)
    if(msg_id == msg_led_cfg[3])LED3_ON();
  #endif
  #if (SHELL_LED_MAX > 4)
    if(msg_id == msg_led_cfg[4])LED4_ON();
  #endif
  #if (SHELL_LED_MAX > 5)
    if(msg_id == msg_led_cfg[5])LED5_ON();
  #endif
}

使用特权

评论回复
22
八层楼|  楼主 | 2019-7-6 12:48 | 只看该作者
/******************************************************************************
/ 函数功能:关闭LED信号
/ 修改日期:none
/ 输入参数:none
/ 输出参数:none
/ 使用说明:none
******************************************************************************/
void Ledx_off(uint16_t msg_id)
{
  #if (SHELL_LED_MAX > 0)
    if(msg_id == msg_led_cfg[0])LED0_OFF();
  #endif
  #if (SHELL_LED_MAX > 1)
    if(msg_id == msg_led_cfg[1])LED1_OFF();
  #endif
  #if (SHELL_LED_MAX > 2)
    if(msg_id == msg_led_cfg[2])LED2_OFF();
  #endif
  #if (SHELL_LED_MAX > 3)
    if(msg_id == msg_led_cfg[3])LED3_OFF();
  #endif
  #if (SHELL_LED_MAX > 4)
    if(msg_id == msg_led_cfg[4])LED4_OFF();
  #endif
  #if (SHELL_LED_MAX > 5)
    if(msg_id == msg_led_cfg[5])LED5_OFF();
  #endif
}

使用特权

评论回复
23
八层楼|  楼主 | 2019-7-6 12:49 | 只看该作者
/******************************************************************************
/ 函数功能:取反LED信号
/ 修改日期:none
/ 输入参数:none
/ 输出参数:none
/ 使用说明:none
******************************************************************************/
void Ledx_div(uint16_t msg_id)
{
  #if (SHELL_LED_MAX > 0)
    if(msg_id == msg_led_cfg[0])LED0_DIV();
  #endif
  #if (SHELL_LED_MAX > 1)
    if(msg_id == msg_led_cfg[1])LED1_DIV();
  #endif
  #if (SHELL_LED_MAX > 2)
    if(msg_id == msg_led_cfg[2])LED2_DIV();
  #endif
  #if (SHELL_LED_MAX > 3)
    if(msg_id == msg_led_cfg[3])LED3_DIV();
  #endif
  #if (SHELL_LED_MAX > 4)
    if(msg_id == msg_led_cfg[4])LED4_DIV();
  #endif
  #if (SHELL_LED_MAX > 5)
    if(msg_id == msg_led_cfg[5])LED5_DIV();
  #endif
}

使用特权

评论回复
24
八层楼|  楼主 | 2019-7-6 12:49 | 只看该作者

/******************************************************************************
/ 函数功能:配置LED信号
/ 修改日期:none
/ 输入参数:none
/ 输出参数:none
/ 使用说明:none
******************************************************************************/
void Ledx_config(uint8_t led_id,uint16_t msg_id)
{
    if(0 == led_id)     {LED0_OFF();msg_led_cfg[0]=msg_id;}
  #if(SHELL_LED_MAX > 1)     
    else if(1 == led_id){LED1_OFF();msg_led_cfg[1]=msg_id;}
  #endif
  #if(SHELL_LED_MAX > 2)
    else if(2 == led_id){LED2_OFF();msg_led_cfg[2]=msg_id;}
  #endif
  #if(SHELL_LED_MAX > 3)
    else if(3 == led_id){LED3_OFF();msg_led_cfg[3]=msg_id;}
  #endif
  #if(SHELL_LED_MAX > 4)
    else if(4 == led_id){LED4_OFF();msg_led_cfg[4]=msg_id;}
  #endif
  #if(SHELL_LED_MAX > 5)
    else if(5 == led_id){LED5_OFF();msg_led_cfg[5]=msg_id;}
  #endif
}

使用特权

评论回复
25
八层楼|  楼主 | 2019-7-6 12:49 | 只看该作者

/******************************************************************************
/ 函数功能:读取LED的配置信号
/ 修改日期:none
/ 输入参数:none
/ 输出参数:none
/ 使用说明:none
******************************************************************************/
uint16_t Ledx_read(uint8_t led_id)
{
    if(0 == led_id)     return msg_led_cfg[0];
  #if(SHELL_LED_MAX > 1)
    else if(1 == led_id)return msg_led_cfg[1];
  #endif
  #if(SHELL_LED_MAX > 2)
    else if(2 == led_id)return msg_led_cfg[2];
  #endif
  #if(SHELL_LED_MAX > 3)
    else if(3 == led_id)return msg_led_cfg[3];
  #endif
  #if(SHELL_LED_MAX > 4)
    else if(4 == led_id)return msg_led_cfg[4];
  #endif
  #if(SHELL_LED_MAX > 5)
    else if(5 == led_id)return msg_led_cfg[5];
  #endif
    else return 0;
}

/******************************************************************************
***********************************   END  ************************************
******************************************************************************/

使用特权

评论回复
26
八层楼|  楼主 | 2019-7-6 12:50 | 只看该作者
四. shell使用以MDK为例:
1. 将shell.c等文件加入工程

使用特权

评论回复
27
八层楼|  楼主 | 2019-7-6 12:50 | 只看该作者
2. 包含Shell.h,并外部声明shell服务程序

/******************************************************************************
*********************************Shell 函数声 明 ******************************
******************************************************************************/
extern void Shell_SPI_Service(void);
extern void Shell_RTC_Service(void);
extern void Shell_WIZ_Service(void);
extern void Shell_UPAN_Service(void);
extern void Shell_IAP_Service(uint8_t const this_ver);

shell_GPIO_Config(30,10,46,1);  //shell接口和四个LED灯的信号配置
shell_Init(460800);     //初始化shell控制台







使用特权

评论回复
28
八层楼|  楼主 | 2019-7-6 12:50 | 只看该作者
3. 在main,c的大循环中添加以下代码
        //Shell构架的控制台服务
        if(shell_rx_rdy)
        {
            Shell_IAP_Service(SOFT_VER);    //IAP模块指令处理
            Shell_SPI_Service();            //SPI_FLASH模块指令处理
            Shell_WIZ_Service();            //网卡模块的指令处理
            Shell_RTC_Service();            //RTC模块的指令处理
            Shell_MCU_Service();            //MCU杂项功能指令处理
            Shell_VLSI_Service();           //声卡模块的指令处理
            Shell_UPAN_Service();           //U盘模块的指令处理
            Shell_Invalid_Service();        //指令无效的缺省处理
        }

使用特权

评论回复
29
八层楼|  楼主 | 2019-7-6 12:51 | 只看该作者
4. 编译下载文件到STM32,完成后字节在超级终端上敲击Enter就会显示AT:OK!的字样表示可以正常通讯
注意事项:
1. 打开超级终端的本地回显功能
2. 有些终端工具输入Enter'时只输出(\r码) 如SecureCRT,这时需要将Enter映射按键(\r\n),winXP的超级终端输入Enter是输出(\r\n两个码值的)


使用特权

评论回复
30
八层楼|  楼主 | 2019-7-6 12:51 | 只看该作者
五. RTC Shell服务文件示例
这里展示一个Shell服务的文件模板写法:

/*********************************Copyright (c)*********************************
**                              
**                                 FIVE工作组
**
**---------------------------------File Info------------------------------------
** File Name:               rtc_shell.c
** Last modified Date:      2014/3/5 9:27:49
** Last Version:            V2.0  
** Description:             文件操作命令解释,需要Console Shell V2以上支持
**
**------------------------------------------------------------------------------
** Created By:              wanxuncpx
** Created date:            2014/3/5 9:28:31
** Version:                 V2.0
** Descriptions:            none
**------------------------------------------------------------------------------
** HW_CMU:                  ANSIC
** Libraries:               NONE
** version                  NONE
*******************************************************************************/

/******************************************************************************
更新说明:
******************************************************************************/

/******************************************************************************
*********************************  编 译 控 制 ********************************
******************************************************************************/
#define RTC_SHELL       //注释掉时屏蔽iap shell功能

/******************************************************************************
********************************* 文件引用部分 ********************************
******************************************************************************/
/*---------------------*
*     文件包含
*----------------------*/
//基础支持文件
#include "shell.h"          //Shell支持文件,含bool,uint8_t..以及串口数据收发操作
#include "rtc.h"         //命令控制支持文件

/*---------------------*
*     Shell版本判断
*----------------------*/
#ifdef SHELL_VER
  #if (SHELL_VER < 2)
    #error "shell版本太低"
  #endif
#else
    #error "未找到Shell文件,或shell版本信息"
#endif

/******************************************************************************
********************************* 输出函数功能 ********************************
******************************************************************************/
/*---------------------*
*       输出函数功能
*----------------------*/
#ifdef RTC_SHELL
  extern void Shell_RTC_Service(void);
#else
  void Shell_RTC_Service(void){;}
#endif

/*---------------------*
*       输入函数
*----------------------*/
//none

/******************************************************************************
********************************* 数 据 声 明 *********************************
******************************************************************************/
#ifdef RTC_SHELL
/*---------------------*
*      
*----------------------*/
//命令帮助文件
const char RTC_HelpMsg[] =
        "[RTC contorls]\r\n"
        " rtc help\t\t- help.\r\n"
        " rtc rd info\t\t- Read RTC info.\r\n"
        " rtc rd time\t\t- Read RTC date and time.\r\n"
        " rtc wr time <Hour>:<Minute>:<Second>    - Write time.\r\n"
        " rtc wr date <Year>-<Month>-<Day> <Week> - Warning Week=[1..7]\r\n"
        "\r\n";
       
/******************************************************************************
********************************* 函 数 声 明 *********************************
******************************************************************************/

使用特权

评论回复
31
八层楼|  楼主 | 2019-7-6 12:52 | 只看该作者
/******************************************************************************
/ 函数功能:文件系统Shel指令处理
/ 修改日期:2013/9/10 19:04:15
/ 输入参数:输入当前的程序版本
/ 输出参数:none
/ 使用说明:none
******************************************************************************/
void Shell_RTC_Service(void)
{
    uint8_t     *ptRxd;         //用于接收指令处理
    //uint8_t     *ptTxd;         //方便用于指令发送
    int         i,j,k,l;
    //int         tx_len,drv;
    //uint32_t    u32_arg[4];
    uint16_t    retval;
    uint8_t     arg[32];
    uint32_t    tmp_time;

    //指令初级过滤
    //--------------------------------------------------------------------------
    //格式:<->[cmd bytes]<CRLF>  即"-[cmd bytes]\r\n"
    //指令必须以"-"开始, 以"\r\n"结束
    i = shell_rx_rdy;
    if( (i < 2) || ('\r' != shell_rx_buff[i-2]) || ('\n' != shell_rx_buff[i-1]))return;
   
    //长度和前缀过滤
    ptRxd = (uint8_t *)shell_rx_buff;
    if( (' ' != shell_rx_buff[3]) || ('r' != shell_rx_buff[0]) || (i < 6) ||
        ('t' != shell_rx_buff[1]) || ('c' != shell_rx_buff[2]) )  return;
        
    //处理指令
    //--------------------------------------------------------------------------
    ptRxd += 4;
    if(StrComp(ptRxd,"rd time"))    //按包读取指令
    {
        RTC_Sprintf_CurrTime((void *)arg);  
        printf("Time:%s\r\n",arg);
    }
    else if(StrComp(ptRxd,"rd info\r\n"))      //读取RTC信息
    {
        //打印当前时间和上次复位时间
        RTC_Sprintf_CurrTime((void *)arg);
        printf("->Time:%s\tResetCounter:%d\r\n",arg,RESET_CNT);
        RTC_Sprintf_ResetCurr((void *)arg,&tmp_time);
        printf("\tCurrReset:%s\tRun: %d Days, %d hour, %d minute\r\n",
            arg,tmp_time/(24*60),(tmp_time%(24*60))/60,tmp_time%60 );
        RTC_Sprintf_ResetLast((void *)arg,&tmp_time);
        printf("\tNextReset:%s\tRun: %d Days, %d hour, %d minute\r\n",
            arg,tmp_time/(24*60),(tmp_time%(24*60))/60,tmp_time%60 );   
    }
    else if(StrComp(ptRxd,"wr time "))      //写时间
    {
        retval = sscanf((void*)shell_rx_buff,"%*s%*s%*s%d:%d:%d",&i,&j,&k);
        if(3 != retval)return;   //没有接收到3个输入数据,直接退出
        if(RTC_TimeWrite((uint8_t)i,(uint8_t)j,(uint8_t)k) )
        {
            RTC_Sprintf_CurrTime((void *)arg);
            printf("->CurrTime:%s\r\n",arg);   
        }
        else
        {
            printf("->Error Time Input!\r\n");
            shell_rx_rdy = 0;       //不用触发错误指令显示
            return;   
        }
    }
    else if(StrComp(ptRxd,"wr date "))      //写日期
    {
        retval = sscanf((void*)shell_rx_buff,"%*s%*s%*s%d-%d-%d %d",&i,&j,&k,&l);
        if(4 != retval)return;   //没有接收到4个输入数据,直接退出
        if(RTC_DateWrite((uint16_t)i,(uint8_t)j,(uint8_t)k,(uint8_t)l))
        {
            RTC_Sprintf_CurrTime((void *)arg);
            printf("->CurrTime:%s\r\n",arg);   
        }
        else
        {
            printf("->Error Date Input!\r\n");
            shell_rx_rdy = 0;       //shell_rx_rdy为0,表示指令已被处理完毕,否者下个Shell服务继续调用
            return;   
        }
    }
    else if(StrComp(ptRxd,"help\r\n"))      //指令帮助
    {
        shell_SendStr((void *)RTC_HelpMsg);
    }
    else return;
   
    //退出处理
    //--------------------------------------------------------------------------
    shell_rx_rdy = 0;   //shell_rx_rdy为0,表示指令已被处理完毕,否者下个Shell服务继续调用
}

/******************************************************************************
***********************************   END  ************************************
******************************************************************************/
#endif

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则