(一)技巧------ 人机交互
在实际项目中,会有很多信息,如设备基本信息,协议信息,网络配置等等,这些信息我们可以通过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\r\n",(char*)pbyData)); 10 } 11 void reboot(void *pbyData) 12 { 13 TCLX_PLATFORM_DIAG(("reboot function:%s\r\n",(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\r\n",(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]\r\n",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\r\n"); 13 } 14 void test(int data) 15 { 16 printf("data:%d\r\n",data); 17 } 18 int main(void) 19 { 20 upperMachineACK(upperMachineReadACK); 21 upperMachineACK2(10,test); 22 return 0; 23 }