首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

串口调试互交组件-USMART V1.0

串口调试互交组件-USMART V1.0

USMART是这几天开发出来的一个串口调试互交组建,有了它,你可以通过串口调用任何一个程序里面的函数(仅限参数为10/16进制的函数),并在下位机执行.例如,我 在调试一个摄像头,我想修改里面的一个寄存器,来看看不同情况下面的结果,传统的方法就是改变一下,刷一次代码,这样浪费了时间不说,单片机也很可能被刷坏.或者自己写一个串口协议,从串口发送一个字节过来,然后执行改变,这样可以节省时间,但是需要花一定精力来写一个这样的协议及函数来实现这个功能.
    使用USMART,则可以十分方便的实现以上功能了.比如,在代码里面设置寄存器的函数原形为:
//写寄存器
void COM_WR_Reg(u8 Reg, u16 RegValue)
{
     WR_REG(Reg);  
     WR_DATA(RegValue);        
}
    在usmart组件的帮助下,我们只需要在串口调试助手,输入:COM_WR_Reg(0X03,0X12AB),就可以修改03寄存器的值为0X12AB了.
    这样,完全不需要你自己编写其他多余代码,也不用编写专门的函数,直接在usmart下,即可调用任意一个函数.是不是很方便?呵呵,先上图吧,看看实际运行的效果.


输入"?"获得帮助(也可以通过输入help来获得帮助)

输入"list",列出所有可用的usmart函数.注意,这里的函数没有上线,可以自己随意增加的.

执行LCD_Init函数的结果.
在液晶上指定位置显示一个数字

在液晶上的 100,100坐标画一个70为半径的圆.
非法的输入.(没有输入括号.)

    USMART的使用很简单,比如我们在综合实验中要使用USMART,只需要增加一个USMART的组,把usmart.c,usmart_str.c,usmart_config.c加入即可.然后在主函数的头文件里面增加usmart.h.如下图所示:

    usmart.c包含与外部互交的函数.usmart_str.c主要负责命令和参数解析.usmart_config.c主要由用户添加需要usmart管理的函数.不过这里我们还需要借助到外部的usart.c的支持,在ALIENTEK提供的例程里面,我们只需要把usart.h里面的 #define EN_USART1_RX //使能串口1接收 使能即可.
    在调用的时候,我们先执行usmart_dev.init(); //初始化 USMART 以初始化usmart.(其实这里就是串口初始化一下,其他的啥也没做).
    然后每隔一定时间执行一次usmart_dev.scan();//执行usmart   就可以了.
    usmart_dev.scan()函数用于获取从串口发送过来的指令,并解析和执行.
    我们可以通过定时器中断,来执行usmart_dev.scan();也可以通过在主循环里面扫描执行usmart_dev.scan();.两种方式选择自己合适的就可以了.
    最后再介绍一下如何在usmart_config.c中添加自己的函数.方法如下:

       1,把要加入usmart的函数所在的头文件包含近来,如上图中最上的红圈内.
       2,把要加入usmart的函数名及其字符串函数名增加到usmart_nametab中,如上图左下的红圈内.
       3,编译下载.
       经过这三步,我们就可以在串口控制加入usmart的函数了.如下图所示:

      上面列出的list,就是我们在usmart_nametab中输入的所有函数.
      然后我们在串口输入各个函数及其正确的参数后,键入回车,并发送给stm32之后,usmart就开始执行你输入的函数了.如下图所示:


     这里附上源码(综合实验+usmart).采用定时器3的中断来执行usmart_dev.scan()函数.每100ms执行一次.
    提醒大家:参数一定不要乱输,否则可能导致不可预知的结果!!!


里面usmart.c中usmart_exe函数有bug.当输入参数大于等于6个的时候,会出错.先修改该bug,如下:
//usamrt执行函数
//该函数用于最终执行从串口收到的有效函数.
//最多支持10个参数的函数,更多的参数支持也很容易实现.不过用的很少.一般5个左右的参数的函数已经很少见了.
//该函数会在串口打印执行情况.以:"函数名(参数1,参数2...参数N)=返回值".的形式打印.
//当所执行的函数没有返回值的时候,所打印的返回值是一个无意义的数据.
void usmart_exe(void)
{
u8 id,i;
u32 res;
id=usmart_dev.id;
if(id>=usmart_dev.fnum)return;//不执行.
printf("\r\n%s(",usmart_dev.funs[id].name);//输出正要执行的函数名
for(i=0;i<usmart_dev.pnum;i++)//输出参数
{
  printf("%d",usmart_dev.parm);
  if(i!=usmart_dev.pnum-1)printf(",");
}
printf(")");
switch(usmart_dev.pnum)
{
  case 0://无参数(void类型)            
   res=usmart_dev.funs[id].func();
   break;
     case 1://有1个参数
   res=usmart_dev.funs[id].func(usmart_dev.parm[0]);
   break;
     case 2://有2个参数
   res=usmart_dev.funs[id].func(usmart_dev.parm[0],usmart_dev.parm[1]);
   break;
     case 3://有3个参数
   res=usmart_dev.funs[id].func(usmart_dev.parm[0],usmart_dev.parm[1],usmart_dev.parm[2]);
   break;
     case 4://有4个参数
   res=usmart_dev.funs[id].func(usmart_dev.parm[0],usmart_dev.parm[1],usmart_dev.parm[2],usmart_dev.parm[3]);
   break;
     case 5://有5个参数
   res=usmart_dev.funs[id].func(usmart_dev.parm[0],usmart_dev.parm[1],usmart_dev.parm[2],usmart_dev.parm[3],usmart_dev.parm[4]);
   break;
     case 6://有6个参数
   res=usmart_dev.funs[id].func(usmart_dev.parm[0],usmart_dev.parm[1],usmart_dev.parm[2],usmart_dev.parm[3],usmart_dev.parm[4],\
   usmart_dev.parm[5]);
   break;
     case 7://有7个参数
   res=usmart_dev.funs[id].func(usmart_dev.parm[0],usmart_dev.parm[1],usmart_dev.parm[2],usmart_dev.parm[3],usmart_dev.parm[4],\
   usmart_dev.parm[5],usmart_dev.parm[6]);
   break;
     case 8://有8个参数
   res=usmart_dev.funs[id].func(usmart_dev.parm[0],usmart_dev.parm[1],usmart_dev.parm[2],usmart_dev.parm[3],usmart_dev.parm[4],\
   usmart_dev.parm[5],usmart_dev.parm[6],usmart_dev.parm[7]);
   break;
     case 9://有9个参数
   res=usmart_dev.funs[id].func(usmart_dev.parm[0],usmart_dev.parm[1],usmart_dev.parm[2],usmart_dev.parm[3],usmart_dev.parm[4],\
   usmart_dev.parm[5],usmart_dev.parm[6],usmart_dev.parm[7],usmart_dev.parm[8]);
   break;
     case 10://有10个参数
   res=usmart_dev.funs[id].func(usmart_dev.parm[0],usmart_dev.parm[1],usmart_dev.parm[2],usmart_dev.parm[3],usmart_dev.parm[4],\
   usmart_dev.parm[5],usmart_dev.parm[6],usmart_dev.parm[7],usmart_dev.parm[8],usmart_dev.parm[9]);
   break;
}
printf("=%d;\r\n",res);//输出执行结果.
}

继承事业,薪火相传
返回列表