基于arm的多路温度采集控制系统(4)菜单界面

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

菜单界面

基于arm的多路温度采集控制系统(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 4

struct 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_INDEX
                menu_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;
        }
    }

}

名称栏目:基于arm的多路温度采集控制系统(4)菜单界面
分享网址:https://www.cdcxhl.com/article16/jseedg.html

成都网站建设公司_创新互联,为您提供域名注册网站维护品牌网站建设软件开发小程序开发自适应网站

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都做网站