多路温度采集控制系统(5)进程通信

嵌入式项目实践–多路温度采集控制系统(5)进程通信

整个项目运行时,有三个进程:主控服务程序,菜单界面程序,网页监控程序。
进程间通信的功能代码由主控程序中的void* ipcs_pro(void* arg) 线程完成。

通信进程对象

消息队列

  • 菜单界面传送网页更新时间,四路温度报警上限。
  • 主控程序接收菜单界面设置的数据消息。
  • 主控程序接收网页数据更新请求消息。

共享内存

  • 主控程序更新共享内存数据。
  • 网页程序读取更新的共享内存数据。

消息处理线程

    while(1){    
        //接收菜单程序数据   
        msg_menu_update(msgid_menu,g_dev);
        if(msg_recv_webreq(msgid_web)>0){
            //更新共享内存数据
        }                   
        sleep(2);
    }

系统main( )函数

int main(int argc,char* argv[])
{
    pthread_t pth_ipc,pth_com,pth_net;
    //set net port
    if(argc < 2){
        g_net_port = DEF_PORT_8848;
        printf("sys default net port=[8848]\n");
    }else{
        g_net_port = atoi(argv[1]);
    }

    init_sys(); 
    //创建系统各功能线程
    pthread_create(&pth_ipc,NULL,ipcs_pro,NULL);
    pthread_create(&pth_com,NULL,com1_pro,NULL);
    pthread_create(&pth_net,NULL,net_pro,NULL);

    pthread_join(pth_ipc,NULL);
    pthread_join(pth_net,NULL);
    pthread_join(pth_com,NULL); 
}

程序代码

进程通信头文件

#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;
};
//网页请求消息
struct st_msg_req{
    long int index;
    char req;       
};

int get_msgid_web(void);//网页消息队列id
int get_msgid_menu(void);//菜单消息队列id
int msg_recv_webreq(int msgid);//接收网页请求消息
void* set_web_shm(void);//设置网页共享内存
int msg_send_webupdate(int msgid,struct st_sys * g_dev);//向网页发送数据消息
int msg_menu_update(int msgid,struct st_sys* g_dev);//菜单更新消息
#endif

进程通信实现程序

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "sys_ipc.h"
#include "config.h"


//同网页进程通信的队列,key=1234
int get_msgid_web(void)
{
    int id = -1;
    id = msgget((key_t)1234,0666|IPC_CREAT);
    if(id == -1){
        printf("msgget error\n");
        exit(1);
    }
    return id;
}

//同菜单进程通信的队列,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;
}

int msg_menu_update(int msgid,struct st_sys* g_dev)
{
    int i;
    long int msg_type;
    struct st_msg cmd;

    msg_type = UPDATE_TIME_SMG_INDEX;
    if(msgrcv(msgid,(void*)&cmd,4,msg_type,IPC_NOWAIT)==-1){
        //return -1;//如果退出,后面的消息收不到
    }else{
        g_dev->update_time=cmd.dat;
        printf("update_time=%d\n",g_dev->update_time);
        save_dev(g_dev);        
    }

    for(i=0;i<4;i++){
        msg_type = TEMP_SMG_INDEX_BASE+i;
        if(msgrcv(msgid,(void*)&cmd,4,msg_type,IPC_NOWAIT)==-1){
            //return -1;//如果退出,后面的消息收不到
        }else{
            g_dev->temp_max[i]=cmd.dat;
            printf("temp_max[%d]=%d\n",i,g_dev->temp_max[i]);
            save_dev(g_dev);        
        }       

    }

    return 0;
}

int msg_recv_webreq(int msgid)
{
    int i;
    long int msg_type;
    struct st_msg_req cmd;

    msg_type = WEB_UPDATE_SMG_INDEX;
    if(msgrcv(msgid,(void*)&cmd,1,msg_type,IPC_NOWAIT)==-1){
        return -1;
    }else{
        if(cmd.req==0x1)
            return 1;
    }
    return 0;       
}


int msg_send_webupdate(int msgid,struct st_sys * g_dev)
{
    struct st_msg_dev cmd;
    cmd.index = WEB_SMG_INDEX;
    memcpy(&cmd.dev,g_dev,sizeof(struct st_sys));
    if(msgsnd(msgid,(void*)&cmd,sizeof(struct st_sys),0)==-1)
        return -1;
    return 0;
}

//设置共享内存
void* set_web_shm(void)
{
    int shmid;
    void* shmaddr=(void*)0;

    if((shmid=shmget((key_t)2345,sizeof(struct st_sys),0666|IPC_CREAT))<0){
        return NULL;
    }else{  
        if((shmaddr=shmat(shmid,(void*)0,0))==(char *)-1){
            return NULL;
        }
    }

    printf("set shm ok...\n");
    return shmaddr;
}

系统主控程序
功能:初始化系统数据,处理各进程间数据通信,创建串口处理线程,网络处理线程,通信处理线程。

#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>    

#include "sys_ipc.h"
#include "config.h"
#include "net_pro.h"
#include "com_pro.h"

struct st_sys g_dev[1]; //系统配置结构体全局变量
int g_net_port;//网络端口

int init_sys(void)
{   
    printf("init system struct,LED flash.\n");
    load_dev(g_dev);
}

//进程间通信处理
void* ipcs_pro(void* arg)
{
    int i,msgid_menu,msgid_web;
    struct st_sys* shm_dev;

    printf("temp control pthread start...\n");
    if((msgid_menu=get_msgid_menu()) < 0){
        printf("msg_menu error\n"); 
        exit(1);
    }   
    if((msgid_web=get_msgid_web()) < 0){
        printf("msg_web error\n");  
        exit(1);
    }
    if((shm_dev=(struct st_sys*)set_web_shm())==NULL){
        printf("shm_web error\n");  
        exit(1);
    }   

    while(1){       
        msg_menu_update(msgid_menu,g_dev);

        if(msg_recv_webreq(msgid_web)>0){
            //update shm
            for(i=0;i<DEF_MAX_CHANNEL;i++){

                shm_dev->temp_max[i] = g_dev->temp_max[i];
                shm_dev->temp_data[i] = g_dev->temp_data[i];
                shm_dev->status[i] = g_dev->status[i];
            }

            shm_dev->update_time = g_dev->update_time;
        }                   
        //msg_send_webupdate(msgid_web,g_dev);
        sleep(2);
    }
}

int main(int argc,char* argv[])
{
    pthread_t pth_ipc,pth_com,pth_net;
    //set net port
    if(argc < 2){
        g_net_port = DEF_PORT_8848;
        printf("sys default net port=[8848]\n");
    }else{
        g_net_port = atoi(argv[1]);
    }

    init_sys(); 
    //创建系统各功能线程
    pthread_create(&pth_ipc,NULL,ipcs_pro,NULL);
    pthread_create(&pth_com,NULL,com1_pro,NULL);
    pthread_create(&pth_net,NULL,net_pro,NULL);

    pthread_join(pth_ipc,NULL);
    pthread_join(pth_net,NULL);
    pthread_join(pth_com,NULL); 
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
隧道工程机电设备智能监控及维护 维护管理随着现代化进程的加快,我国的交通系统也在不断发展和完善,高速公路 越来越多,发展建设山区高速公路会是未来高速公路发展的一个趋势,这会对隧道工程 机电设备的智能监控和维护管理提出更高的要求。隧道工程机电设备智能监控和维护管 理是近些年才发展起来的全新行业,科技含量高,行业发展和更新也很快。同时,随着 隧道工程的发展,隧道工程机电设备的智能监控和维护管理工作也会变得越来越重要。 因此,需要重视机电设备智能监控和维护管理工作并培养工作人员的探索精神、创新精 神,从而促进机电设备智能监控和维护管理工作的完成。 1隧道工程机电设备智能监控系统 1.1系统概述 机电设备的智能监控系统一般包括计算机技术、现代信息处理技术、集成电子技术 、智能自动化技术、现代通信技术、管理与决策支持技术和控制与系统技术等,该系统 通过信息的搜集、传送、加工以及使用,充分地将资源整合并加以应用。 1.2建立隧道工程机电设备智能监控系统的必要性 隧道工程的安全性主要受地质因素和管理因素的影响,机电设备智能监控系统可以 实时确定隧道管理是否到位,发生地质灾害时,可以通过智能监控确定隧道的安全性, 只要隧道出现异常情况,智能监控系统可以启动应急模式,进行防灾、救援和事故处理 指挥,从而减少损失。因而,建立隧道工程机电设备智能监控系统是很必要的。 1.3隧道工程机电设备智能监控系统的构成 根据隧道管理的需求,隧道机电设备智能监控系统包括多个部分,这多个部分同时 工作以提高隧道的安全性。 1.3.1综合监控系统 综合监控系统涵盖了多个组成部分,有火灾自动报警和联动子系统、监控子系统、 电力监控子系统与隧道紧急对讲电话等,这些系统通过隧道职能中心互相构成网络,一 起工作,极大的提高了隧道安全性[1]。 综合监控中心平台综合监控中心的局域网一般 都是采用标准以太网,同时,鉴于双网热备、冗余、开放、易扩展的优势,目前基本都 使用双网,这样可以使监控系统趋于稳定状态,即使产生了单点故障,也不能造成别的 设备的非正常运转。 设备监控子系统设备监控子系统通常由现场总线、控制器及其温 湿度探测器构成,呈分散式。其系统直接接入局域网,可以采集环境和机电设备的信息 。 火灾自动报警子系统火灾自动报警子系统包括消防专用电话总机、火灾报警主机、 联动控制器、隧道紧急电话主机、光电式感烟探测器、感温光纤探测器、信号线缆、手 动报警按钮等设备。他会对设备内的情况进行实时监控,发生火灾时,系统将首先确认 火灾的发生,然后及时发出警报,向各部门通知,再通过广播让大家得知火灾消息,及 时进行人员疏散,并且联动控制排水系统和诱导发布系统、车道灯控系统以及电气照明 系统等。他有抑制火灾的扩大,减少财产损失及人员伤亡的优点。 电力监控系统电力 监控系统虽多为分散安装,但其管理模式又较为集中,通过站级管理层、网络通信层和 间隔设备层多个部分来实现监控系统的高效运行。此系统依托网络平台保证测控单元与 交直流电用电系统监控安全运行,并使得间隔设备和站级管理层设备连了起来。 1.3.2智能交通系统 智能交通系统包括中心监控平台、高清视频事件检测子系统、交通诱导发布子系统 、警用无线通信子系统、违法抓拍子系统等一系列的部件。 高清视频事件检测子系统 高清视频事件检测子系统的设备构成复杂。前端设备包括高清彩色摄像机、手动变 焦镜头、解码器、视频编码器、云台等。中心设备通常包括中心控制服务器、系统管理 服务器、高清视频事件检测服务器、高清视频事件检测主机等多个部件。他们相互配合 ,实时监控、组织和控制交通,确保交通状况良好[2]。 交通诱导信息发布子系统 交通诱导信息发布子系统由两部分组成,一是交通诱导屏;二是诱导信息分析处理 。该系统的设备包括诱导屏控制单元、LED交通诱导屏、交通诱导服务器、操作终端等 。系统会根据交通状况而改变显示的内容,缓解道路拥堵,确保交通畅通。 隧道车道灯控制子系统 此系统主要包括车道灯信号机、隧道车道灯组、中心管理主机及控制软件等几个部 分。该系统可以采集交通信息,发出指令,控制信号灯,从而达到管制交通的作用。同 时,隧道车道灯控制子系统可以配合交通诱导信息发布系统阻止车辆进入隧道,方便及 时地实施救援活动。 警用无线通信子系统 此系统将无线通信子系统和交管无线通信子系统联合,采用直放站加漏缆方式。其 主要被公安部门和交管部门使用以处理各种突发事件。 隧道超速违法抓拍和禁行子系统 此系统包括数据接收处理服务器、前端违法抓拍设备、数据库服务器、和操作终端 等多个部分。其主要作用是可以抓拍超速车辆。 2隧道工程机电设备的维护管理 2.1隧道工程机电设备维护管理的必要性 首先,机电设备是否能正常运转,关系着高速路上的一切事宜,包括收费、监控系 统、通讯和稽查
C#示例源码 C#示例 C#源码 C#示例源代码 C#源代码 C#源代码例子 C#例子 注意:本源代码共有20章节,分五部分上传,名称分别为:明日科技《C#示例源代码》(1-4)、明日科技《C#示例源代码》(1-4)、明日科技《C#示例源代码》(5-8)、明日科技《C#示例源代码》(9-12)、明日科技《C#示例源代码》(13-16)、明日科技《C#示例源代码》(17-20)。 源代码目录: 第1章 窗体及菜单设计 实例001 自定义最大化、最小化和关闭按钮 2 实例002 磁性窗体的设计 5 实例003 鼠标穿透窗体 12 实例004 窗体的浮动及隐藏 14 实例005 手动改变自制窗体的大小 16 实例006 自定义屏保 19 实例007 向窗体中拖放图片并显示 22 实例008 仿Windows XP系统的任务栏菜单 26 实例009 用树型列表动态显示菜单 28 第2章 控件开发与应用 实例010 自定义水晶按钮控件 34 实例011 自制数值文本框组件 38 实例012 美化单选按钮和复选按钮 43 实例013 重绘ListBox控件 48 实例014 带行数和标尺的RichTextBox 49 实例015 根据文件大小显示文件复制进度条 54 实例016 弹出模式窗口显示进度条 58 实例017 Popup窗口提醒 61 实例018 Vista风格的日历 64 实例019 像Excel一样复制DataGridView中的单元格区域数据 69 实例020 DataGridView中单元格合并及添加、显示行号 74 实例021 从DataGridView控件中拖放数据到TreeView控件 78 第3章 图形图像及多媒体应用 实例022 生成中文验证码 86 实例023 生成图片缩略图 88 实例024 不失真压缩图片 90 实例025 批量图像格式转换 93 实例026 屏幕颜色拾取器 96 实例027 为数码照片添加日期 98 实例028 批量添加图片水印 100 实例029 仿QQ截图功能 104 实例030 屏幕抓图 107 实例031 抓取网站整页面 109 实例032 电子石英钟 113 实例033 图片自动播放 115 实例034 MP3播放器 118 实例035 播放FLV文件 121 实例036 Flash播放器 125 第4章 报表打印技术 实例037 自定义横向或纵向打印 130 实例038 自定义打印页码范围 133 实例039 分页打印 138 实例040 打印条形码 141 实例041 打印学生个人简历 145 实例042 打印商品入库单据 148 实例043 批量打印学生证书 150 实例044 动态绑定水晶报表 153 实例045 设计信封标签报表 157 实例046 设计汇款单式报表 157 第5章 鼠标键盘控制 实例047 自定义动画鼠标 161 实例048 鼠标设置器 163 实例049 屏蔽鼠标按键 167 实例050 虚拟键盘 172 实例051 设置/屏蔽系统热键 182 实例052 使用键盘控制窗体或控件的移动 189 实例053 多功能键盘 190 第6章 操作系统相关技术 实例054 利用API设置桌面背景 196 实例055 音乐风景桌面 198 实例056 定时关闭计算机 201 实例057 设置任务栏时间 205 实例058 CPU使用率 206 实例059 进程管理器 209 实例060 数字大小写转换 212 实例061 系统挂机锁 214 实例062 全角半角转换 218 实例063 动态系统托盘图标 221 实例064 开机启动项管理 224 实例065 显示器控制 228 实例066 屏幕放大镜 231 实例067 身份证号码验证工具 233 第7章 文件及数据流应用 实例068 文件批量更名 241 实例069 分割与合成文件 244 实例070 伪装文件夹 247 实例071 获取所有逻辑磁盘目录 250 实例072 汉字转拼音 253 实例073 使用C#操作INI文件 255 实例074 使用C#操作XML文件 257 实例075 创建PDF文档 261 实例076 批量将Word文档转换为HTML网页 263 实例077 Word目录提取工具 265 实例078 文件批量解压缩 269 第8章 网络开发应用 实例079 局域网端口扫描 276 实例080 局域网IP地址扫描 280 实例081 自动更换IP地址 283 实例082 IP地址及手机号码归属地查询 286 实例083 获取网络信息及流量 290 实例084 获取指定地区天气预报 292 实例085 发送与接收邮件 297 实例086 调用OutLook发送邮件 304 实例087 以断点续传方式下载文件 306 实例088 远程关闭与重启计算机 308 实例089 点对点聊天程序设计 311 实例090 网络电台 314 第9章 数据库及LINQ技术 实例091 通用数据库连接 319 实例092 读取数据库中的数据表结构 324 实例093 对数据库进行分离、附加、备份及还原操作 331 实例094 综合查询职工详细信息 338 实例095 使用二进制存取用户头像 342 实例096 使用交叉表实现商品销售统计 345 实例097 通过视图修改职工信息 347 实例098 通过存储过程对职工信息进行管理 350 实例099 使用触发器添加、修改及删除职工信息 356 实例100 使用LinqToSql操作SQL数据库 358 实例101 使用LinqToObjects操作数组及集合 363 实例102 使用LinqToDataSet操作数据集 365 实例103 使用LinqToXML操作XML文件 369 第10章 程序安全控制 实例104 防止SQL注入式攻击 377 实例105 对文件进行加密保护 378 实例106 对数据报进行加密保障通信安全 384 实例107 使用伪随机数加密技术加密用户登录密码 388 实例108 使用口令加密可执行文件 390 实例109 限制软件的使用次数 394 实例110 使用强名称标识软件 399 实例111 软件加壳常用工具及使用 400 第11章 硬件开发技术 实例112 加密狗实现软件注册 405 实例113 通过摄像头制作大头贴 408 实例114 短信猫实现短信投票 412 实例115 企业员工IC卡开发 416 实例116 多路视频监控 422 实例117 使用ID卡识别员工编号 428 实例118 使用数据采集器实现库存盘点 434 实例119 员工考勤指纹识别 436 第12章 游戏开发 实例120 贪吃蛇 444 实例121 华容道 451 实例122 俄罗斯方块 458 实例123 五子棋 466 技术要点对应实例位置 479

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值