OneNET麒麟座应用开发之六:与气体质量流量控制器通讯

气体质量流量控制器,简称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=0;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[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_t length,uint8_t command,uint8_t processNum,uint8_t paraType)
{
  uint8_t txBuf[20];
  uint16_t index=6;

  txBuf[0]=':';
  txBuf[1]=0x04+(uint8_t)length;
  txBuf[2]=0x0A;
  txBuf[3]=command;
  txBuf[4]=0x80+processNum;
  txBuf[5]=paraType;
 
  for(int i=0;i<length;i++)
  {
    txBuf[i+6]=data[i];
  }

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

  SendData(txBuf,length+8);
}

5)读数据

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

 

/*读取参数值*/

void GetMFCParaValue(uint8_t processNum,uint8_t paraType,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查看最后的显示结果如何。显示数据更新正确,如下图:

 

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

原文地址:https://www.cnblogs.com/foxclever/p/6891763.html