气体质量流量控制器,简称MFC,通常用于在各种检测中,计量气体的流量。在我们的大气环境数据采集站中,要让气流保持稳定,这样才能准确的获取PM25的数据。

我们采用的气体质量流量控制器具备串口通讯功能,采集流量信号并更具设定数据自动调节流量。我们采用的质量流量控制器如下:

1、协议描述

该类型的质量流量控制器采用RS232 ASCII通讯协议,协议的格式非常简单,如下图所示:

其中,:是起始字符。len1, len2 是指包括节点地址在内的信息的字节数长度, 即基本信息的长度+1。node1, node2是目标设备的节点地址。data1, data2,具体信息。CR是结束字符。

除了起始字符和结束字符外,其他的全部字节都会按1个字节转化为2个16进制表示的ASCII码字符。如:0x2A会被转化为0x32和0x41两个ASCII码字符。

对于发送错误信息的报文有一定的区别,如下图:

其长度是固定的,与正确状态下的信息格式略有差别。

2、硬件设计

因为采用的是串口通讯,所以硬件的连接比较简单。麒麟座上的USART1(PA9:USART1_TX,PA10:USART1_RX)端口已经引到了J2端子排的J2_6和J2_5,所以我们就是用这一接口。如下图所示:

但是由于OneNET麒麟座山是TTL电平,而质量流量控制器是RS232的接口,所以我们还需要一个用于电平转换的摸块,我们平时就是使用一种如下图的TLL转RS232的接口模块,这次也使用它。

至此,硬件连接就不会有问题了。

3、软件设计

接下来我们看看软件方面的设计,在开始具体的软件设计之前,我们看一看流量控制器中具体的参数存储地址和没操作命令。

1)操作命令

命令字符串是以ASCII码表示的二进制字符串。质量流量控制器具有9种命令,我们并不需要用到其中的全部命令,具体如下图所示:

2)数据类型与地址

该种类型的气体质量流量计拥有将近300个参数可供读或者写,但我们通常用不到这么多,我们只考虑其中的几个参数:

  • 流量测量值,地址为205,浮点类型。
  • 流量设定值,地址为206,浮点类型。
  • IO状态,地址为86,字节型数据。
  • 控制模式,地址为12,字节型数据。

气体质量流量控制器的参数数据类型有5种,分别为:字符型、整型、浮点型、长整型以及字符型,如下图:

有了以上这些准备我们就可以开始编写程序了。首先我们编写一个串口发送数据的通用函数:

//数据发送
void SendData(uint8_t *txData,uint16_t length)
{
uint16_t i;
for(i=;i<length;i++)
{
//传送寄存器不为空,等待传送结束 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
{
}
// 写一个字节到对应的串口传送数据寄存器
USART_SendData(USART1, txData[i]);
}
}

3)读取状态信息

我们之所以要单独对状态信息编写操作程序,是因为它的报文格式与读取其他参数有一定的区别,如下图:

/*获取状态*/
void GetMFCStatus(uint8_t status,uint8_t index)
{
uint8_t txBuf[]; txBuf[]=':';
txBuf[]=0x04;
txBuf[]=0x0A;
txBuf[]=0x00;
txBuf[]=status;
txBuf[]=index
txBuf[]=0x0D;
txBuf[]=0x0A; SendData(txBuf,);
}

4)写数据

接下来我们来看看如何写数据,主要用于设置各种参数值,对于我们来说设置流量设定值是必须的,具体报文格式如下:

/*读取参数值*/
void SetMFCParaValue(uint8_t *data,uint16_t length,uint8_t command,uint8_t processNum,uint8_t paraType)
{
uint8_t txBuf[];
uint16_t index=; txBuf[]=':';
txBuf[]=0x04+(uint8_t)length;
txBuf[]=0x0A;
txBuf[]=command;
txBuf[]=0x80+processNum;
txBuf[]=paraType; for(int i=;i<length;i++)
{
txBuf[i+]=data[i];
} txBuf[+length]=0x0D;
txBuf[+length+]=0x0A; SendData(txBuf,length+);
}

5)读数据

接下来我们来看看如何读取数据,主要用于获取各种参数值,对于我们来说读取流量测量值是必须的,具体报文格式如下:

/*读取参数值*/

void GetMFCParaValue(uint8_t processNum,uint8_t paraType,uint8_t paraNum,uint8_t strLength)
{
uint8_t txBuf[]; txBuf[]=':';
txBuf[]=0x07;
txBuf[]=0x0A;
txBuf[]=0x04;
txBuf[]=0x80+processNum;
txBuf[]=paraType;
txBuf[]=processNum&0x7F;
txBuf[]=paraNum;
txBuf[]=strLength;
txBuf[]=0x0D;
txBuf[]=0x0A; SendData(txBuf,);
}

4、结果展示

我们在完成上述编写后编译下装,并上传到OneNET查看最后的显示结果如何。显示数据更新正确,如下图:

至此,我们完成了读取气体质量流量控制器的数据测试。

OneNET麒麟座应用开发之六:与气体质量流量控制器通讯的更多相关文章

  1. OneNET麒麟座应用开发之八:采集大气压力等环境参数

    采集大气压力和温度也是核算大气标准状况下的各种数据的必须参数,为此我们必须知道压力和温度才能计算标准状况下的各种参数,于此我们需要一个既能检测压力也能检测温度的元件. 1.硬件概述 MS5837压力传 ...

  2. OneNET麒麟座应用开发之七:控制采样电机

    气体采样采用主动抽取气体的方式保证充足而平稳的气流,所以我们采用气泵抽取气体来完成. 1.设计概述 客户对这部分要求能够设定电机的速度,但并不需要动态调节.对电机的控制有很多方式,我们采用比较简单的方 ...

  3. OneNET麒麟座应用开发之五:获取加速度传感器ADXL345数据

    由于数据采集站基本都安装在野外或者楼顶,安装位置以及震动对检测数据的准确性有一定影响.所以想要有一个位置状态数据,正好发现麒麟作上有ADXL345,这样一个数字输出的加速度传感器.如图中红框所示: 1 ...

  4. OneNET麒麟座应用开发之四:数据上传测试

    已经测试过OneNET麒麟座开发板了,这次来尝试与OneNET的连接和数据上传.这也是我们测试这块开发办的主要原因,因为在十几种我们有这种将分散的采集点数据上传到后台的需求. 先看看麒麟座这块开发板, ...

  5. OneNET麒麟座应用开发之一:初识OneNET麒麟座

    今天收到了OneNET麒麟座开发板.能得到使用的机会只能说是幸运的.首先上一张靓照: 板子使用的MCU是STM32F103RET6,带有GSM摸块和Wifi摸块可以联网.带有显示屏接口和I2C接口以及 ...

  6. OneNET麒麟座应用开发之三:获取温湿度数据

    对于大气环境监测来说温湿度也是重要的指标.原本计划使用SHT15来采集温湿度数据,不过在OneNET麒麟开发板上,我们发现已经集成有SHT20温湿度传感器,于是我们就使用它了.如下图的红框处: 我们还 ...

  7. OneNET麒麟座应用开发之十:空气质量数据监测站项目总结

    大气质量数据监测站用于测试空气质量监测及数据采集,实现野外或者室内空气质量的检测. 1.项目概述 本项目是一个定制项目,要求采集大气的压力.温度.湿度.PM25.位置等数据并上传到指定的后台服务器.但 ...

  8. MVC5 网站开发之六 管理员 1、登录、验证和注销

    上次业务逻辑和展示层的架构都写了,可以开始进行具体功能的实现,这次先实现管理员的登录.验证和注销功能. 目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项目 MV ...

  9. MVC5 网站开发之六 管理员 2、添加、删除、重置密码、修改密码、列表浏览

    目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项目 MVC5 网站开发之三 数据存储层功能实现 MVC5 网站开发之四 业务逻辑层的架构和基本功能 MVC5 网 ...

随机推荐

  1. git<git常用命令>

    1,初始化仓库: git init --此命令会在当前目录下新建一个Git仓库.新建了一个 .git的隐藏目录,仓库的所有数据都放在这个目录里.目前还是空的. 2,跟踪,暂存文件: git add - ...

  2. 织梦dedecms自定义搜索可以按照附加表字段进行搜索

    因为需要在网上搜索了一下找到此修改方法: 首先 是新建模型:商标信息 模型:附加表为dede_shangbiao ,附加字段先添加了2个,sbID(商标ID)和chuangyi(创意说明)然后 打开需 ...

  3. 误删除 linux 系统文件了?这个方法教你解决

    转载于互联网并适当的修改 误删除linux系统文件了?不用急,本文将给你一个恢复linux文件的方法,让你轻松应对运维中的各风险问题.方法总比问题多~ 说在前面的话 针对日常维护操作,难免会出现文件误 ...

  4. golang匿名结构体

    go语言定义结构体类型时可以仅指定字段类型而不指定字段名字.这种字段叫做匿名字段(anonymous field). Go语言有一个特性允许只声明一个成员对应的数据类型而不指名成员的名字:这类成员就 ...

  5. Netty 实现HTTP文件服务器

    一,需求 文件服务器使用HTTP协议对外提供服务.用户通过浏览器访问文件服务器,首先对URL进行检查,若失败返回403错误:若通过校验,以链接的方式打开当前目录,每个目录或文件都以超链接的形式展现,可 ...

  6. GC.SuppressFinalize()的正确用法

    SuppressFinalize函数是: 该方法在对象头中设置一个位,系统在调用终结器时将检查这个位.obj 参数应为此方法的调用方. 实现 IDisposable 接口的对象可以从 IDisposa ...

  7. new和delete

    和 sizeof 类似,sizeof不是函数,它是一个操作符,它在编译期就完成了计算,在函数运行期间它已经是一个常数值了. int a; sizeof(int) = 4; sizeof(a) = 4; ...

  8. Docker入门02——Dockerfile详解

    基本示例 FROM MAINTAINER LABEL RUN ADD COPY CMD ENTRYPOINT ENV EXPOSE VOLUME WORKDIR USER ARG 基本示例 # Thi ...

  9. Asp.net MVC Session过期异常的处理

    一.使用MVC中的Filter来对Session进行验证 (1)方法1: public class MyAuthorizeAttribute : FilterAttribute, IAuthoriza ...

  10. [C++]指针和指向数组的指针[一维数组与指针]

     1.一维数组与指针      形如:int型 数组 a[10]                1)&a[0]  地址常量;地址类型:int *型   ; 存储数组a的首地址          ...