zoukankan      html  css  js  c++  java
  • (一)技巧------ 人机交互

      在实际项目中,会有很多信息,如设备基本信息,协议信息,网络配置等等,这些信息我们可以通过DEBUG宏来开启或者关闭不同的Debug信息,当我们需要设置模块某些参数的时候,我们可以通过动态输入,而不是直接在程序中写死,大大方便了我们调试设备,我们可以实行两种方案:1.串口接收 2.HTML通过socket配置 。由于第二种方式需要设备必须连接网线,所以我们今天来讲解记录一下第一种人机交互方式-------串口

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <stdlib.h> 
     4  
     5 #define TCLX_PLATFORM_DIAG(x) do {printf x;} while(0)
     6 
     7 void set(void *pbyData)
     8 {
     9     TCLX_PLATFORM_DIAG(("set function:%s
    ",(char*)pbyData));
    10 }
    11 void reboot(void *pbyData)
    12 {
    13     TCLX_PLATFORM_DIAG(("reboot function:%s
    ",(char*)pbyData));
    14 }
    15 void show(void *pbyData)
    16 {
    17     uint8_t byIndex = atoi(pbyData);
    18     switch(byIndex)
    19     {
    20         case 0:break;
    21         case 1:break;
    22         case 2:break;
    23         default:break;
    24     }
    25     TCLX_PLATFORM_DIAG(("show function:%s
    ",(char*)pbyData));
    26 }
    27 
    28 typedef struct command
    29 {
    30     char *name;
    31     char *explain;
    32     void (*function)(void*);
    33 
    34 }command; 
    35 
    36 void dealCommand(char *pbyData)
    37 {
    38      static command Commands[] = {
    39     {"show","-0:all,-1:protocol,-2:Device,-3:NetInfo",set},
    40     {"reboot","-0:Reboot,-1:Reboot App1,-2:Reboot App2",reboot},
    41     {"set","-set:did=*&;dhcp=*;mac=*.*.*.*.*.*;lip=*.*.*.*;sub=*.*.*.*;gtw=*.*.*.*;dns=*.*.*.*;",set},
    42     };
    43 
    44     if(pbyData == NULL) return; 
    45     char byIndex = 0;
    46     bool bIshelp = strcmp(pbyData,"help");
    47     for(byIndex = 0; byIndex < (sizeof(Commands) / sizeof(command));byIndex ++)
    48     {
    49         if(bIshelp == 0)
    50         {
    51             TCLX_PLATFORM_DIAG(("%2d.%s:[%s]
    ",byIndex + 1,Commands[byIndex].name,Commands[byIndex].explain));
    52         }
    53         else
    54         {
    55             if(0 == strncmp(pbyData,Commands[byIndex].name,strlen(Commands[byIndex].name)))
    56             {
    57                 Commands[byIndex].function(pbyData + strlen(Commands[byIndex].name) + sizeof(':'));
    58             }        
    59         }    
    60 
    61     }
    62 
    63 }

    以上寥寥几行代码就能将项目所需的debug信息输出出来,若支持多个APP还可以从不同的分区启动程序,还可以将设备的配置信息通过串口解析到设备中并重启。如set:llip=192.168.100.101;esip1=120.192.58.188;ept1=6000;nsip1=120.192.58.188;npt1=6000; set函数就通过设备运行初始化的时候,将配置信息读取到全局变量,然后

    通过strstr() 将配置信息分割,从而修改全局变量的值,然后将配置信息都处理完成后,写入flash,并重启设备。

    void set (void *pdata)
    {
        sprintf(s_abyTmepStr,"nsip%d=",bySocketIndex + 1);
                if(((pStrStart = strstr(pData,s_abyTmepStr)) != NULL))
                {
                    sscanf(pStrStart + strlen(s_abyTmepStr),"%d.%d.%d.%d",abyTemp,abyTemp + 1,abyTemp + 2,abyTemp + 3);
                    s_tSerInfo.m_adwIp[NET_TRANSMIT_NB][bySocketIndex] = (abyTemp[0] << 24) + (abyTemp[1] << 16) + (abyTemp[2] << 8) + abyTemp[3];
                }
    }

     回调函数测试:

     1     
     2 void upperMachineACK(void(*funCallBack)())
     3 {
     4         funCallBack();
     5 }
     6 void upperMachineACK2(int data,void(*funCallBack)())
     7 {
     8     funCallBack(data);
     9 }
    10 void upperMachineReadACK()
    11 {
    12     printf("hello world
    "); 
    13 }
    14 void test(int data)
    15 {
    16     printf("data:%d
    ",data);
    17 }
    18 int main(void)
    19 {
    20     upperMachineACK(upperMachineReadACK);
    21     upperMachineACK2(10,test);
    22     return 0;
    23 }
  • 相关阅读:
    c++第二十八天
    pyDay16
    c++第二十七天
    c++第二十六天
    WinForm 应用程序的打包与部署
    更换Winform 皮肤(下)----完全GDI+绘制
    更换Winform 皮肤(上)----使用现有皮肤
    KeyValuePair用法(转)
    C#中HashTable的用法
    WinForm----DataGridview---连接数据库,以及双击一条数据,显示信息到Label控件,也可以是TextBox控件。
  • 原文地址:https://www.cnblogs.com/st-home/p/11734468.html
Copyright © 2011-2022 走看看