本文主要是介绍多路温度采集控制系统(4)菜单界面,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
嵌入式项目实践–多路温度采集控制系统(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);
向队列发送消息
struct st_msg cmd;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;
消息类型处理
#define TEMP_SMG_INDEX_BASE 10
#define UPDATE_TIME_SMG_INDEX 4
msg_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"//消息队列接收时索引值
#define TEMP_SMG_INDEX_BASE 10
#define WEB_SMG_INDEX 2
#define WEB_UPDATE_SMG_INDEX 3
#define UPDATE_TIME_SMG_INDEX 4struct st_msg{long int index;int dat;
};struct st_msg_dev{long int index;struct st_sys dev;
};#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"int menu_alarm(char * cmd);//报警功能菜单
int get_line(char *cmd);//获取命令行输入struct st_sys g_dev[1];//全局变量char shell_s[]="\nG9000 shell>$: ";//命令行提示符号//同菜单进程通信的队列,key=4455
int get_msgid_menu(void)
{int id = -1;id = msgget((key_t)4455,0666|IPC_CREAT);if(id == -1){printf("msgget error\n");exit(1);}return id;
}//向主控程序发送设置的数据
/*============================================
函数名称:menu_send_update
功能:向主控程序发送设置的数据
参数:long int 消息类型 int 消息数据
返回值:return 0 返回主菜单
============================================*/
int menu_send_update(long int index,int dat)
{int msgid;struct st_msg cmd;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;return 0;
}/*============================================
函数名称:menu_alarm
功能:温湿度报警设置菜单
参数:char* cmd 用户输入的命令
返回值:return 0 返回主菜单
============================================*/
int menu_alarm(char* cmd)
{int channel;long int msg_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':return 0;break; default:printf("输入选项错误!\n");break;} }return 1;
}//命令行输入处理
int get_line(char *cmd)
{int i=0;char temp;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++;}return 0;
}/*============================================
函数名称:main
功能:系统命令行处理菜单主程序,通过队列同后台程序通信
参数:void * arg
返回值:int
============================================*/int main(void)
{char cmd[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;}}}
这篇关于多路温度采集控制系统(4)菜单界面的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!