阅读以下说明,回答问题1至问题3,将解答填入答题纸的对应栏内。 【说明】 某综合化智能空气净化器设计以微处理器为核心,包含各种传感器和控制器,具有检测环境空气参数(包含温湿度、可燃气体、细颗粒物等),空气净化、加湿、除湿、加热和杀菌等功能,并能通过

admin2017-11-27  30

问题 阅读以下说明,回答问题1至问题3,将解答填入答题纸的对应栏内。
【说明】
    某综合化智能空气净化器设计以微处理器为核心,包含各种传感器和控制器,具有检测环境空气参数(包含温湿度、可燃气体、细颗粒物等),空气净化、加湿、除湿、加热和杀菌等功能,并能通过移动客户端对其进行远程控制。
    图1-1为该系统电气部分连接图,除微处理器外,还包括了片上32KB FLASH,以及SRAM和EEPROM。

该系统采用数字式激光传感器检测PM2.5、PM10,并通过异步串行接口将数据上报给处理器,通信波特率为9600bps,上报周期为1.5秒,数据帧内容包括:报文头、指令号、数据(6字节)、校验和及报文尾,具体字段描述如表1-1所示。

    王工根据数据报文通信协议,使用C语言编写了对应的数据接收和校验程序,请根据注释要求补全程序。
  程序段如下:
  #define uintl 6_t unsigned short
  #define uint8_t unsigned char
  uintl6_t Pm25;
  uintl6_t Pm10;
  void ProcessSerialData()
  {
uint8 t mData=0;
    uint8 t i=0;
    uint8 t mPkt[10]={0);
    uint8 t mCheck=0;
    while(Serial.available()>0)
    {
    mData=Serial.read();
    delay(2);    //延迟2毫秒
    if(mData=  (1)  )  //等待直到有效数据包接收到
    {
    mPkt[0]=mData;
    mData=Serial.read();
    if(mData= (2) )
    {
    mPkt[1]=mData;
    mCheck=0;
    for(i=0;i<6;i++)  //接收数据并进行校验计算
    {
      mPkt[i+2]=Serial.read();
      delay(2);
      mCheck+=(3)
    )
    mPkt[8]=Serial.read();
    delay(1);
    mPkt[9]=Serial.read();
    if(mCheck=(4))  //校验判断
    {
       Serial.flush();
    //请使用位操作方式计算Pm25和Pml0的值
       Pm25=(5)
       Pml0=(6)
         }
       }
     }
   }
  return;
}
    注释:
Serial.available():判断串口接收缓冲器的状态函数。读取串口接收缓冲器的值(128字节寄存器),以判断数据送达到串口。
    返回:串口已经准备好的字节数。
    Serial.read():读取串口函数。
    返回:串口的数据第一个字节,如果没有返回一1。
    Serial.flush():清除串口缓冲器内容函数。
    返回:None。

选项

答案(1)0xAA (2)0xC0 (3)mPkt[i+2] (4)mPkt[8] (5)(uintl6_t)mPkt[2]|(uintl6_t)(mPkt[3]<<8)或其等价形式 (6)(uintl6_t)mPkt[4]|(uintl6_t)(mPkt[5]<<8)或其等价形式

解析 此题考查嵌入式系统底层代码的阅读与理解及编写的能力,结合题目给出的代码分析如下:
    首先定义数据类型,为了在不同平台之间更方便的移植,嵌入式系统代码编写时经常对数据类型进行重新定义。题目代码中明确说明了此类定义后,考生在答题时应尽量使用定义后的数据类型声明。
    #define uintl 6_t unsigned short
    #define uint8_t unsigned char
    void ProcessSerialData()
    {
    uint8_t mData=0;
    uint8_t i=0;
    uint8_t mPkt[10]={0),
    uint8_t mCheck=0;
    /表示串口已经准备好了数据,Serial.available判断串口接收缓冲器的状态函数相关说明已在题目中给出。
    */
    while(Serial.available()>0)
    {
    mData=Serial.read();
    //通过Serial.read读取串口函数接口读一个字节串口数据,存到mData变量中。
    delay(2);    //延迟2ms,确保数据包已被接收。
    if(mData==0xAA)//判断是否为数据帧头,帧头标志0xAA已在题目中给出。
    {
    mPkt[0]=mData;
    //如果为帧头,说明一帧数据开始,此时将帧头存到接收缓冲区内
mData=Serial.read();
    /*使用Serial.read接口继续读取一个字节帧数据,存到mData变量中,完整的代码此时也应用延时1一2ms的操作*/
    if(mData==0xc0)//继续判断是否为指令号0xC0,即数据帧中第二个字节内容
    {
    mPkt[1]=mData;  //将指令号0xC0存到接收缓冲区内
    mCheck=0;    //校验和变量mCheck清零
    for(i=0;i<6;i++)    //data recv and crc calc
    //使用Serial.read接口循环接收6个字节的数据,依次存入接收缓冲区中
    {
    mPkt[i+2]=Serial.read();
    delay(2);  //每次调用Serial.read接口读数据后,延迟2ms的时间
    mCheck+=mPkt[i+2];//计算校验和,存到变量mCheck中
    }
    mPkt[8]=Seriall.read();
    //使用Seriall.read接口读取校验和数据,存到接收缓冲区中
    delay(1);
    mPkt[9]=Seriall.read();  //使用Seriall.read接口读取帧尾数据
    if(mCheck==mPkt[8])    //判断校验和是否相符
    {
    Seriall.flush();
    /*校验和相符,表示已完成一帧数据接收,调用Seriall.flush接口清除串口
    数据*/
    Pm25=(uintl6一t)mPkt[2]|(uintl6一t)(mPkt[3]<<8);
    /*计算PM2.5的数值,题目给出数据1表示PM2.5的低字节,数据2表示PM2.5的高字节,因此将字节序为3的数据mPkt[3]左移8位于字节序为2的数据
    mPkt[2]进行或操作得出,注意使用强制类型转换,位操作的方式计算量相对小,计算速度快,因此在计算资源紧张的嵌入式环境中大量使用*/
    Pm10=(uint16一t)mPkt[4]|(uint16一t)(mPkt[5]<<8);
    //get one good packet
    return;
    }
   }
  }
}
通过上述分析,容易得出各问题答案如下:
(1)判断是否为数据帧的帧头,查题干数据可知帧头标识为0xAA;
(2)判断是否为数据帧的指令号,查题干数据可知指令号为0xC0:
(3)进行CRC计算,根据代码上下文可知为为第2~7字节数据mPkt[i+2];
(4)进行CRC校验,查题干数据可知CRC校验位为mPkt[8];
    (5)考查位操作,根据题干数据可知为数据2左移8位加上数据l(uintl6_t)mVkt[2]|
(uintl6_t)(mPkt[3]<<8)或者(uintl6_t)((mPkt[3]<<8)|mPkt[2]);
    (6)考查位操作,根据题干数据可知为数据4左移8位加上数据3(uintl6_t)mPkt[4]|
(uintl6_t)(InPl(t[5]<<8)或者(uintl6_t)((mPkt[5]<<8)|mPkt[4])。
转载请注明原文地址:https://jikaoti.com/ti/46I7FFFM
0

相关试题推荐
最新回复(0)