嵌入式项目实践–多路温度采集控制系统(4)菜单界面菜单界面

菜单显示

printf("\nTC9000湿温度控制系统V1.0");printf("\n[1]报警设置");printf("\n[2]输出控制设置");printf("\n[3]湿度/温度查询");printf("\n[4]系统设置");printf("\n[x]退出系统");


接收命令行输入

printf(shell_s);fflush(stdout);get_line(cmd);


输入选择处理

switch(cmd[0]){case'1':menu_alarm(cmd);break;case'2':...}


消息队列

获取队列ID

id=msgget((key_t)4455,0666|IPC_CREAT);

向队列发送消息

structst_msgcmd;cmd.index=index;cmd.dat=dat;if((msgid=get_msgid_menu())<0)return-1;if(msgsnd(msgid,(void*)&cmd,sizeof(int),0)==-1)return-1;

消息类型处理

#defineTEMP_SMG_INDEX_BASE10#defineUPDATE_TIME_SMG_INDEX4msg_type=TEMP_SMG_INDEX_BASE+channel;menu_send_update(msg_type,g_dev->temp_max[channel]);消息队列相关命令

#ipcs-q//显示消息队列#ipcrm-q<ID>//删除指定id队列菜单界面代码

菜单程序头文件

#ifndef_TC9000_SYS_IPC_H#define_TC9000_SYS_IPC_H#include"config.h"//消息队列接收时索引值#defineTEMP_SMG_INDEX_BASE10#defineWEB_SMG_INDEX2#defineWEB_UPDATE_SMG_INDEX3#defineUPDATE_TIME_SMG_INDEX4structst_msg{longintindex;intdat;};structst_msg_dev{longintindex;structst_sysdev;};#endif


菜单界面程序



#include<stdlib.h>#include<stdio.h>#include<errno.h>#include<string.h>#include<unistd.h>#include<errno.h>#include<fcntl.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>#include"sys_ipc.h"#include"config.h"intmenu_alarm(char*cmd);//报警功能菜单intget_line(char*cmd);//获取命令行输入structst_sysg_dev[1];//全局变量charshell_s[]="\nG9000shell>$:";//命令行提示符号//同菜单进程通信的队列,key=4455intget_msgid_menu(void){intid=-1;id=msgget((key_t)4455,0666|IPC_CREAT);if(id==-1){printf("msggeterror\n");exit(1);}returnid;}//向主控程序发送设置的数据/*============================================函数名称:menu_send_update功能:向主控程序发送设置的数据参数:longint消息类型int消息数据返回值:return0返回主菜单============================================*/intmenu_send_update(longintindex,intdat){intmsgid;structst_msgcmd;cmd.index=index;cmd.dat=dat;if((msgid=get_msgid_menu())<0)return-1;if(msgsnd(msgid,(void*)&cmd,sizeof(int),0)==-1)return-1;return0;}/*============================================函数名称:menu_alarm功能:温湿度报警设置菜单参数:char*cmd用户输入的命令返回值:return0返回主菜单============================================*/intmenu_alarm(char*cmd){intchannel;longintmsg_type;while(1){printf("\n[1]检测间隔时间(5-300s)");printf("\n[2]温度上限报警值(40-90℃)");printf("\n[3]温度下限报警值(-20-5℃)");printf("\n[4]温度报警回差设置(1-10℃)");printf("\n[x]返回主菜单");printf(shell_s);fflush(stdout);get_line(cmd);switch(cmd[0]){case'1':printf("当前检测间隔时间:%d\n",g_dev->update_time);printf("请输入新值:");fflush(stdout);get_line(cmd);g_dev->update_time=atoi(cmd);msg_type=UPDATE_TIME_SMG_INDEXmenu_send_update(msg_type,g_dev->update_time);break;case'2':printf("\n请选择传感器编号[1][2][3][4]:");fflush(stdout);get_line(cmd);channel=atoi(cmd)-1;printf("当前温度上限报警值:%d\n",g_dev->temp_max[channel]);printf("请输入新值:");fflush(stdout);get_line(cmd);g_dev->temp_max[channel]=atoi(cmd);msg_type=TEMP_SMG_INDEX_BASE+channel;menu_send_update(msg_type,g_dev->temp_max[channel]);break;case'x':return0;break;default:printf("输入选项错误!\n");break;}}return1;}//命令行输入处理intget_line(char*cmd){inti=0;chartemp;memset(cmd,0,sizeof(cmd));while(1){temp=getchar();cmd[i]=temp;if(cmd[i]==13||cmd[i]==10){cmd[i]=0;break;}fflush(stdout);i++;}return0;}/*============================================函数名称:main功能:系统命令行处理菜单主程序,通过队列同后台程序通信参数:void*arg返回值:int============================================*/intmain(void){charcmd[16];//命令数据缓冲区load_dev(g_dev);while(1){system("clear");printf("\nTC9000湿温度控制系统V1.0");printf("\n[1]报警设置");printf("\n[2]输出控制设置");printf("\n[3]湿度/温度查询");printf("\n[4]系统设置");printf("\n[x]退出系统");printf(shell_s);fflush(stdout);get_line(cmd);switch(cmd[0]){case'1':menu_alarm(cmd);break;case'2'://menu_out_set(cmd);break;case'3'://menu_data_show(cmd);break;case'4'://menu_sys_set(cmd);break;case'x':exit(0);break;default:printf("输入选项错误\n");break;}}}