微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 与气体质量流量控制器通讯

与气体质量流量控制器通讯

时间:10-02 整理:3721RD 点击:

气体质量流量控制器,简称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_ti;

for(i=0;i<length;i++)

  {

    //传送寄存器不为空,等待传送结束

   while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)

    {

    }

    // 写一个字节到对应的串口传送数据寄存器

   USART_SendData(USART1, txData);

  }

}

(3)读取状态信息

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


/*获取状态*/

void GetMFCStatus(uint8_t status,uint8_t index)

{

  uint8_t txBuf[8];

txBuf[0]=':';

txBuf[1]=0x04;

txBuf[2]=0x0A;

txBuf[3]=0x00;

txBuf[4]=status;

txBuf[5]=index

txBuf[6]=0x0D;

txBuf[7]=0x0A;

  

SendData(txBuf,8);

}

(4)写数据

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


/*读取参数值*/

void SetMFCParaValue(uint8_t *data,uint16_tlength,uint8_t command,uint8_t processNum,uint8_t paraType)

{

  uint8_ttxBuf[20];

  uint16_tindex=6;

txBuf[0]=':';

txBuf[1]=0x04+(uint8_t)length;

txBuf[2]=0x0A;

txBuf[3]=command;

txBuf[4]=0x80+processNum;

txBuf[5]=paraType;

  

  for(inti=0;i<length;i++)

  {

   txBuf[i+6]=data;

  }

txBuf[6+length]=0x0D;

txBuf[6+length+1]=0x0A;

  

SendData(txBuf,length+8);

}

(5)读数据

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


/*读取参数值*/

void GetMFCParaValue(uint8_t processNum,uint8_tparaType,uint8_t paraNum,uint8_t strLength)

{

  uint8_t txBuf[11];

txBuf[0]=':';

txBuf[1]=0x07;

txBuf[2]=0x0A;

txBuf[3]=0x04;

txBuf[4]=0x80+processNum;

txBuf[5]=paraType;

txBuf[6]=processNum&0x7F;

  txBuf[7]=paraNum;

txBuf[8]=strLength;

txBuf[9]=0x0D;

txBuf[10]=0x0A;

  

SendData(txBuf,11);

}

4、结果展示

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


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


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top