接线图

ZigBee传感器采集节点代码编写:

1)在“fire_sensor.c”文件中配置BasicRF无线通信的参数为:RF_CHANNEL20PAN_ID为准考证号后4位。比如准考证号为20610003254400409876,则PAN_ID0x9876

2)在main()函数中添加代码实现以下功能:

火焰传感器数据的采集;

根据以下表1. ZigBee通信协议报文,将采集到的火焰传感器数据正确的填入pTxData[]数组中。(注意:数据域应该按照实际采集的数据进行填写。)

1. ZigBee通信协议报文

组成部分

起始位

命令类型

数据长度

传感器数量

传感器类型

数据域

校验位

长度/字节

1

1

1

1

1

2

1

内容

0xCC

采集数据

LEN

0x01

3(火焰传感器)

Data

CHK

举例

0xCC

0x01

0x07

0x01

0x03

0x00 0x5A

0x32

#include "hal_defs.h"  
#include "hal_cc8051.h"  
#include "hal_int.h"  
#include "hal_mcu.h"  
#include "hal_board.h"  
#include "hal_led.h"  
#include "hal_adc.h"  
#include "hal_rf.h"  
#include "basic_rf.h"  
#include "hal_uart.h"   
#include "TIMER.h"  
#include "get_adc.h"  
#include "sh10.h"  
#include "UART_PRINT.h"  
#include "util.h"  
#include <stdlib.h>  
#include <string.h>  
#include <stdio.h>  
#include <math.h>  

/*点对点通讯地址设置*/
/*.......答题区1开始:ZigBee模块通讯地址参数修改................*/
 //1.将ZigBee通信信道设置为20,网络ID设置为考证号后4位。比如准考证号为20610003254400409876,则PAN_ID为0x9876。

#define RF_CHANNEL  20 //频道11-26
#define PAN_ID 0x0007  //网络id

/*.......答题区1结束.............................*/

#define MY_ADDR                   0xBDC1     //本机模块地址
#define SEND_ADDR                 0xB4F3     //发送地址
/* 自定义消息格式 */
#define START_HEAD    0xCC//帧头
#define CMD_READ      0x01//读传感器数据
#define SENSOR_FIRE   0x03//火焰
/*  LED n 闪烁 time 毫秒 宏 */
#define FlashLed(n,time) do{\
                   halLedSet(n);\
                   halMcuWaitMs(time);\
                   halLedClear(n);\
                   }while(0)
/*数组大小*/
#define MAX_SEND_BUF_LEN  128 //无线数据最大发送长度

//#define CC2530_DEBUG //调试

/*变量*/
static basicRfCfg_t basicRfConfig; 
static uint8 pTxData[MAX_SEND_BUF_LEN]; //定义无线发送缓冲区的大小

uint8   APP_SEND_DATA_FLAG;  

/*****************************************************************************************
*函数:uint8 CheckSum(uint8 *buf, uint8 len) 
*功能:计算校验和 
*输入:uint8 *buf-指向输入缓存区, uint8 len输入数据字节个数 
*输出:无 
*返回:返回校验和 
*特殊说明:无 
*****************************************************************************************/ 
uint8 CheckSum(uint8 *buf, uint8 len)  
{  
  uint8 temp = 0;  
  while(len--)  
  {  
    temp += *buf;  
    buf++;  
  }  
  return (uint8)temp;  
}  


void ConfigRf_Init(void)  
{  
  basicRfConfig.panId       =   PAN_ID;        //zigbee的ID号设置  
  basicRfConfig.channel     =   RF_CHANNEL;    //zigbee的频道设置  
  basicRfConfig.myAddr      =   MY_ADDR;   //设置本机地址  
  basicRfConfig.ackRequest  =   TRUE;          //应答信号  
  while(basicRfInit(&basicRfConfig) == FAILED); //检测zigbee的参数是否配置成功  
  basicRfReceiveOn();                // 打开RF  
}  

void main(void)    
{
    halBoardInit();  //模块相关资源的初始化
    ConfigRf_Init(); //无线收发参数的配置初始化 
    Timer4_Init(); //定时器初始化
    Timer4_On();  //打开定时器
    
    while(1)
    {   APP_SEND_DATA_FLAG = GetSendDataFlag();           
        if(APP_SEND_DATA_FLAG == 1)   //定时时间到
        {   /*【传感器采集、处理】 开始*/
            uint16 FireAdc;
            
            /*.......答题区2开始.......................................*/
            //1.火焰传感器数据的采集。
            FireAdc = get_adc();
       
            /*.......答题区2结束.......................................*/
            
#ifdef CC2530_DEBUG
            //把采集数据传化成字符串,以便于在串口上显示观察
            uart_printf("火焰传感器,红外线(火焰)数字量:%dmV\r\n", FireAdc*10); 
#endif /*CC2530_DEBUG*/
            
            memset(pTxData, '\0', MAX_SEND_BUF_LEN);
            pTxData[0]=START_HEAD;//帧头
            pTxData[1]=CMD_READ;//命令
            pTxData[2]=7;//长度
            pTxData[3]=1;//1组传感数据
            pTxData[4]=SENSOR_FIRE;//传感类型
            
            /*.......答题区3开始.......................................*/
            //1.根据协议将采集到的火焰传感器数据正确封装到pTxData[]数组中。
            pTxData[5] = (uint8)((FireAdc * 10) >> 8);
            pTxData[6] = (uint8)(FireAdc * 10);
            
            /*.......答题区3结束.......................................*/
            
            
            pTxData[7]=CheckSum((uint8 *)pTxData, pTxData[2]);
            //产生一个随机延时,减少信道冲突
            srand1(FireAdc);
            halMcuWaitMs(randr( 0, 3000 ));
            //把数据通过zigbee发送出去
            basicRfSendPacket((unsigned short)SEND_ADDR, (unsigned char *)pTxData, pTxData[2]+1);
            FlashLed(1,1000);//无无线发送指示,LED1亮1000ms
            Timer4_On();  //打开定时
         }  /*【传感器采集、处理】 结束*/           
    }
}

ZigBee汇聚节点代码编写:

1)参考“fire_sensor.c”,在“collect.c”文件中实现BasicRF无线通信参数配置。

2)开启宏开关#define CC2530_DEBUG,使用考试资源包“4. 使用工具文件夹中的串口调试助手打印火焰传感器数据并将截图保存至图集.docx”中的3.png处。

3)关闭宏开关//#define CC2530_DEBUG,将采集到的火焰传感器数据通过串口发送给M3网关节点。

#include "hal_defs.h"
#include "hal_cc8051.h"
#include "hal_int.h"
#include "hal_mcu.h"
#include "hal_board.h"
#include "hal_led.h"
#include "hal_rf.h"
#include "basic_rf.h"
#include "hal_uart.h" 
#include "hal_pwm.h" 
#include "UART_PRINT.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "TIMER.h"
#include "get_adc.h"
#include "util.h"  

/*点对点通讯地址设置*/
/*.......答题区4开始:ZigBee模块通讯地址参数修改................*/
 //1.将ZigBee通信信道设置为20,网络ID设置为考证号后4位。比如准考证号为20610003254400409876,则PAN_ID为0x9876.

#define RF_CHANNEL  20 //频道11-26
#define PAN_ID 0x0007  //网络id

/*.......答题区4结束.............................*/

#define MY_ADDR                   0xB4F3     //本机模块地址

/********无线数据缓存********/
#define MAX_RECV_BUF_LEN  128
static uint8 pRxData[MAX_RECV_BUF_LEN]; //定义无线接收缓冲区的大小
uint8 uart0_send_buf[8] = {0};//串口0发送缓冲区
 
/********变量********/
static basicRfCfg_t basicRfConfig;

/*.......答题区5开始................*/
//1.打印串口输出接收到的火焰传感器数据。
//#define CC2530_DEBUG //调试
/*.......答题区5结束................*/

/*  LED n 闪烁 time 毫秒 宏 */
#define FlashLed(n,time) do{\
                   halLedSet(n);\
                   halMcuWaitMs(time);\
                   halLedClear(n);\
                   }while(0)

//生成数组的16进制形式的字符串格式
uint8 GetHexStr(uint8 *input, uint8 len, uint8 *output)
{
  char str[128];
  memset(str, '\0', 128);
  for(uint8 i=0; i<len; i++)
  {
    sprintf(str+i*3,"%02X ", *input);
    input++;
  }
  strcpy((char *)output, (const char *)str);
  return strlen((const char *)str);
}

// 无线RF初始化
void ConfigRf_Init(void)
{
    basicRfConfig.panId       =   PAN_ID;        //zigbee的ID号设置
    basicRfConfig.channel     =   RF_CHANNEL;    //zigbee的频道设置
    basicRfConfig.myAddr      =   MY_ADDR;   //设置本机地址
    basicRfConfig.ackRequest  =   TRUE;          //应答信号
    while(basicRfInit(&basicRfConfig) == FAILED); //检测zigbee的参数是否配置成功
    basicRfReceiveOn();                // 打开RF
}

void main(void)
{
    halBoardInit();  //模块相关资源的初始化
    ConfigRf_Init(); //无线收发参数的配置初始化 
    Timer3_Init(); //定时器初始化
    Timer3_On();  //打开定时器
    
    uint16 len = 0;
    
    while(1)
    {
        //无线数据接收处理
        if(basicRfPacketIsReady())   //查询有没收到无线信号
        {
            len = basicRfReceive(pRxData, MAX_RECV_BUF_LEN, NULL);//接收无线数据
#ifdef CC2530_DEBUG
            char DebugOutput[256];
            memset(DebugOutput, '\0', 256);
            GetHexStr((uint8 *)pRxData, len, (uint8 *)DebugOutput); 
            uart_printf("接收到原始无线RF数据:%s\r\n",DebugOutput);
#else       
            uart0_send_buf[0] = 0x55;
            uart0_send_buf[1] = pRxData[5]; //读取ADC数据高位寄存器
            uart0_send_buf[2] = pRxData[6]; //读取ADC数据低位寄存器 
            uart0_send_buf[3] = 0xDD;
            halUartWrite(uart0_send_buf, 4); //发送数据
            
            FlashLed(2,1000);//无线发送指示,D4闪烁
#endif /*CC2530_DEBUG*/
        }
    }
}

M3网关节点工程代码编写:

1)在“main.c”文件中添加代码实现以下功能:

main()函数中实现:开启UART5的空闲中断;

uart5_data_process()函数中实现:接收来自UART5的火焰传感器数据,按照高位在前低位在后正确封装赋值给adcx变量。

(2)在“process_m3.c”文件中添加代码实现以下功能:

Master_To_Gateway()函数中实现:将转换好的火焰传感器数据通过以下表2. RS-485网络数据帧格式协议中的网关节点举例,正确封装到MASTER_TX_BUF[]数组中,通过串口发送给物联网网关。(注意:数据域应该按照实际采集的数据进行填写。)

CAN_Master_To_Gateway()函数中实现:根据以下表2. RS-485网络数据帧格式的终端节点举例,采集CAN总线上的终端节点传感器数据。正确封装到MASTER_TX_BUF[]数组中,通过串口发送给物联网网关。(注意:数据域应该按照实际采集的数据进行填写。)

表2. RS-485网络数据帧格式

组成部分

帧起始符

地址域

命令码域

数据长度

传感器类型

数据域

校验码域

长度/字节

1

2

1

1

1

2

1

内容

0xDD

DstAddr

0x02(按RS-485网络上报)

Length

1(温湿度传感器)

3(火焰传感器)

Data

CheckSum

终端节点

举例

0xDD

0x0011

0x02

0x09

0x01

0x1A 0x28

0x3C

网关节点

举例

0xDD

0x0022

0x02

0x09

0x03

0x00 0x06

0x13

3)编译下载到网关后,使用“4. 使用工具里的“ M3主控模块配置工具配置节点,将地址设置配置为0x0022,传感器列表配置为火焰,点击设置。并截图保存至图集.docx”中的6.png处。

4)使用CAN调试器USB线(TX,RX),连接主机节点J7的(CANH,CANL)。使用“4. 使用工具里的“CAN调试助手工具进行CAN通信数据的抓包并截图保存至图集.docx”中的7.png处。

(注意:波特率为100k

5)将云平台上实时显示传感器数据信息的界面截图保存至图集.docx”中的8.png处。

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  ** This notice applies to any and all portions of this file
  * that are not between comment pairs USER CODE BEGIN and
  * USER CODE END. Other portions of this file, whether 
  * inserted by the user or by software development tools
  * are owned by their respective copyright owners.
  *
  * COPYRIGHT(c) 2019 STMicroelectronics
  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *   1. Redistributions of source code must retain the above copyright notice,
  *      this list of conditions and the following disclaimer.
  *   2. Redistributions in binary form must reproduce the above copyright notice,
  *      this list of conditions and the following disclaimer in the documentation
  *      and/or other materials provided with the distribution.
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
  *      may be used to endorse or promote products derived from this software
  *      without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "user.h"
#include "user_time.h"  //用户添加头文件包含

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
ADC_HandleTypeDef hadc1;

CAN_HandleTypeDef hcan;

TIM_HandleTypeDef htim2;

UART_HandleTypeDef huart5;
UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;

/* USER CODE BEGIN PV */
uint16_t vol = 0;
float sensor_hum = 0; //湿度
float sensor_tem = 0; //温度
uint8_t switching = 0;
uint8_t sensor_number = 0;
uint16_t send_count = 0;
uint16_t Can_STD_ID = 0;
uint8_t flag_send_data = 0;
uint8_t Can_data[8] = {0};

/* UART5接收相关变量 */
uint8_t uart5RxBuf = 0; //UART5接收变量(1个字节)
uint8_t uart5RxCounter = 0; //UART5接收缓存索引号
uint8_t uart5RxCplt_flag = 0; //UART5接收完成标志位
uint8_t uart5_data_buf[64] = {0}; //UART5接收缓存区

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_CAN_Init(void);
static void MX_ADC1_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_TIM2_Init(void);
static void MX_UART5_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/**
  * @brief  清除uart5接收相关缓存
  * @param  None
  * @retval None
  */
void clear_uart5_rxbuf(void)
{  
  uart5RxBuf = 0;
	uart5RxCounter = 0;
	uart5RxCplt_flag = 0;  
  memset(uart5_data_buf, 0, 64);
}

/**
  * @brief  uart5接收数据处理
  * @param  None
  * @retval None
  */
void uart5_data_process(uint8_t *data)
{
  uint16_t adcx = 0;
	/*.......答题区7开始.......................................*/
	//1.根据data[]数组,将接收到的火焰数据正确封装给adcx变量。
	//比如串口5接收到数据为“55 00 06 DD”,其中00 06是火焰数据,正确封装为adcx = 0006
	adcx = (uint16_t)data[1]<<8;
	adcx = adcx|data[2];
	
	
	
	/*.......答题区7结束.......................................*/

	vol = (adcx * 330) / 4096;
}


/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
  uint8_t flag = 0x00;
  etError error; // error code
  ValueType Value_Type = Value_I2C;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_CAN_Init();
  MX_ADC1_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  MX_TIM2_Init();
  MX_UART5_Init();
  /* USER CODE BEGIN 2 */
  MAX3485_INIT();
  HAL_UART_Receive_IT(&huart5, &uart5RxBuf, 1); //开接收中断
	
	/*.......答题区6开始.......................................*/
	//1.开启UART5的空闲中断。
	__HAL_UART_ENABLE_IT(&huart5,UART_IT_IDLE);
 
 
	
	/*.......答题区6结束.......................................*/
  
#ifdef SHT3X
  error = SHT3X_Init(DEFAULT_SHT3X_ADDR);
  SHT3X_GetTempAndHumi(&sensor_tem, &sensor_hum, REPEATAB_HIGH, MODE_POLLING, 200);
#endif

#ifdef SHT1X
  if (error != NO_ERROR)
  {
    SHT1x_init();
    flag = 0x01;
  }
#endif
  //SHT1x_init();    //温湿度传感器初始化

  if (flag != 0x01)
  {
    printf("温湿度传感器型号:SHT3X\r\n");
  }
  else
  {
    //FLASH_Sensor_Type = 0x08030100;
    printf("温湿度传感器型号:SHT1X\r\n");
  }
  InfraredSensor_Init();
  
  Can_STD_ID = STMFLASH_ReadHalfWord(FLASE_M3_ADDR);        //配置CAN节点发送的标准帧ID
  Sensor_Type_t = STMFLASH_ReadHalfWord(FLASH_Sensor_Type); //配置M3主控模块采集的传感器类型
  open_usart1_receive_interrupt();                          //启动USART1串口中断
 
  CAN_User_Config(&hcan); //CAN总线配置
  can_start();  //启动CAN总线
	HAL_TIM_Base_Start_IT(&htim2);  //开启定时器2

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    Value_Type = ValueTypes(Sensor_Type_t);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    
    /* 发送从CAN总线接收的其他节点数据至网关 */
    if (flag_send_data == 1)
    {
      CAN_Master_To_Gateway(Can_data, 9);
      flag_send_data = 0;
    }  
    
    /* uart5接收完毕 */
    if(uart5RxCplt_flag == 1)
    {
      uart5RxCplt_flag = 0;
      
      /* 处理从uart5收到的数据存入vol变量*/
      uart5_data_process(uart5_data_buf);
      /* 发送从CC2530收到的火焰传感器数据至网关 */
      Master_To_Gateway(Can_STD_ID, Value_Type, vol, switching, sensor_hum, sensor_tem);
      
      clear_uart5_rxbuf();
    }    
    
    //USART1 通过M3主控模块配置工具配置采集传感器类型 或 或者CAN发送标准帧ID (注标准帧不能超过0 to 0x7FF)
    if (!usart1_data_fifo_is_empty())
    {
      HAL_Delay(100);	//看着这里
      process_up();
    }

  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
  PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}

/**
  * @brief ADC1 Initialization Function
  * @param None
  * @retval None
  */
static void MX_ADC1_Init(void)
{

  /* USER CODE BEGIN ADC1_Init 0 */

  /* USER CODE END ADC1_Init 0 */

  ADC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN ADC1_Init 1 */

  /* USER CODE END ADC1_Init 1 */
  /** Common config
  */
  hadc1.Instance = ADC1;
  hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 2;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_0;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel
  */
  sConfig.Rank = ADC_REGULAR_RANK_2;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC1_Init 2 */

  /* USER CODE END ADC1_Init 2 */

}

/**
  * @brief CAN Initialization Function
  * @param None
  * @retval None
  */
static void MX_CAN_Init(void)
{

  /* USER CODE BEGIN CAN_Init 0 */

  /* USER CODE END CAN_Init 0 */

  /* USER CODE BEGIN CAN_Init 1 */

  /* USER CODE END CAN_Init 1 */
  hcan.Instance = CAN1;
  hcan.Init.Prescaler = 40;
  hcan.Init.Mode = CAN_MODE_NORMAL;
  hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
  hcan.Init.TimeSeg1 = CAN_BS1_6TQ;
  hcan.Init.TimeSeg2 = CAN_BS2_2TQ;
  hcan.Init.TimeTriggeredMode = DISABLE;
  hcan.Init.AutoBusOff = ENABLE;
  hcan.Init.AutoWakeUp = DISABLE;
  hcan.Init.AutoRetransmission = DISABLE;
  hcan.Init.ReceiveFifoLocked = DISABLE;
  hcan.Init.TransmitFifoPriority = DISABLE;
  if (HAL_CAN_Init(&hcan) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN CAN_Init 2 */

  /* USER CODE END CAN_Init 2 */

}

/**
  * @brief TIM2 Initialization Function
  * @param None
  * @retval None
  */
static void MX_TIM2_Init(void)
{

  /* USER CODE BEGIN TIM2_Init 0 */

  /* USER CODE END TIM2_Init 0 */

  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  /* USER CODE BEGIN TIM2_Init 1 */

  /* USER CODE END TIM2_Init 1 */
  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 71;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 1000-1;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM2_Init 2 */

  /* USER CODE END TIM2_Init 2 */

}

/**
  * @brief UART5 Initialization Function
  * @param None
  * @retval None
  */
static void MX_UART5_Init(void)
{

  /* USER CODE BEGIN UART5_Init 0 */

  /* USER CODE END UART5_Init 0 */

  /* USER CODE BEGIN UART5_Init 1 */

  /* USER CODE END UART5_Init 1 */
  huart5.Instance = UART5;
  huart5.Init.BaudRate = 115200;
  huart5.Init.WordLength = UART_WORDLENGTH_8B;
  huart5.Init.StopBits = UART_STOPBITS_1;
  huart5.Init.Parity = UART_PARITY_NONE;
  huart5.Init.Mode = UART_MODE_TX_RX;
  huart5.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart5.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart5) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN UART5_Init 2 */

  /* USER CODE END UART5_Init 2 */

}

/**
  * @brief USART1 Initialization Function
  * @param None
  * @retval None
  */
static void MX_USART1_UART_Init(void)
{

  /* USER CODE BEGIN USART1_Init 0 */

  /* USER CODE END USART1_Init 0 */

  /* USER CODE BEGIN USART1_Init 1 */

  /* USER CODE END USART1_Init 1 */
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART1_Init 2 */

  /* USER CODE END USART1_Init 2 */

}

/**
  * @brief USART2 Initialization Function
  * @param None
  * @retval None
  */
static void MX_USART2_UART_Init(void)
{

  /* USER CODE BEGIN USART2_Init 0 */

  /* USER CODE END USART2_Init 0 */

  /* USER CODE BEGIN USART2_Init 1 */

  /* USER CODE END USART2_Init 1 */
  huart2.Instance = USART2;
  huart2.Init.BaudRate = 115200;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART2_Init 2 */

  /* USER CODE END USART2_Init 2 */

}

/**
  * @brief GPIO Initialization Function
  * @param None
  * @retval None
  */
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOE_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(LED4_GPIO_Port, LED4_Pin, GPIO_PIN_SET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(U5_485TX_EN_GPIO_Port, U5_485TX_EN_Pin, GPIO_PIN_RESET);

  /*Configure GPIO pin : LED4_Pin */
  GPIO_InitStruct.Pin = LED4_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(LED4_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pin : U5_485TX_EN_Pin */
  GPIO_InitStruct.Pin = U5_485TX_EN_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(U5_485TX_EN_GPIO_Port, &GPIO_InitStruct);

}

/* USER CODE BEGIN 4 */
//当产生串口中断后,最终会跳到这
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  if (huart == &huart1) //判断是哪个串口产生的中断
  {
    usart1_data_fifo_put(usart1RxBuf); //向USART1串口缓冲区写入数据
    HAL_UART_Receive_IT(&huart1, &usart1RxBuf, 1);
  }

  if (huart == &huart2)
  {
    usart2_data_fifo_put(usart2RxBuf); //向USART2串口缓冲区写入数据
    HAL_UART_Receive_IT(&huart2, &usart2RxBuf, 1);
  }
  
  if (huart->Instance == UART5)
  {
    uart5_data_buf[uart5RxCounter++] = uart5RxBuf;
    HAL_UART_Receive_IT(&huart5, &uart5RxBuf, 1); //重新开接收中断
  }
}


void USER_IDLE_IRQHandler(UART_HandleTypeDef *huart)
{
  /* 判断是否是串口5空闲中断 */
  if (huart->Instance == UART5)
  {
    /* 判断是否是空闲中断 */
    if (__HAL_UART_GET_FLAG(&huart5, UART_FLAG_IDLE) != RESET)
    {
      uart5RxCplt_flag = 1; //接收完成标志位置1

      /* 清除空闲中断标志(否则会一直不断进入中断) */
      __HAL_UART_CLEAR_IDLEFLAG(&huart5);
    }
  }
}

//当串口出错,跳转到此
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
  printf("UART Error:%x\r\n", huart->ErrorCode); //报告错误编号
  huart->ErrorCode = HAL_UART_ERROR_NONE;

  if (huart == &huart1)
  {
    HAL_UART_Receive_IT(&huart1, &usart1RxBuf, 1); //重新打开USART1接收中断
  }

  if (huart == &huart2)
  {
    HAL_UART_Receive_IT(&huart2, &usart2RxBuf, 1); //重新打开USART2接收中断
  }
}
/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */

  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
#include "process_m3.h"


#define START 0xDD  //起始位
#define CMD   0x02  //命令类型
#define LEN   0x09  //数据长度


#define GATEWAY_ADDR	0xaa
#define MASTER_TX_BUF_LEN 0x08
#define CMD_READ_SENSOR 0x01
#define CMD_CONTROL_RELAY 0x02

extern uint16_t vol;
extern float sensor_hum; //湿度
extern float sensor_tem; //温度
extern uint8_t switching;
extern uint8_t sensor_number;

#ifdef  ADDR_ONE
static uint8_t MASTER_TX_BUF[USART2_DATA_FIFO_BUF_SIZE]={0};
static uint8_t MASTER_DATA[USART2_DATA_FIFO_BUF_SIZE]={0};
#endif

static uint8_t Type_Sensor=0;
//static uint8_t Count_Sensor=0;
//static uint8_t Data_Sensor=0;
 

static uint8_t Relay1_Status=0;
static uint8_t Relay2_Status=0;	
static uint8_t Relay3_Status=0;


/*******************************************************************
*函数:uint8_t CHK(uint8_t *buf, uint8_t len)
*功能:计算累加和
*输入:uint8_t *buf :需要累加的数
			 uint8_t len :累加数的个数
*返回:累加和
*特殊说明:无
*******************************************************************/
uint8_t CHK(const uint8_t *buf, uint8_t len) //校验码
{
    uint8_t  RX_CHX=0;

    while(len--)
    {
        RX_CHX+= *buf;
        buf++;
    }

    return RX_CHX&=0xff;
}

/*******************************************************************
*函数:ValueType  ValueTypes(uint8_t sensor_type)
*功能:判断传感器值类型
*输入:uint8_t sensor_type:传感器类型
*返回:传感器值的类型
*特殊说明:无
*******************************************************************/
ValueType  ValueTypes(uint8_t sensor_type)
{
	ValueType ValueType_t;
	if(sensor_type==TemHum_Sensor)   //温湿度    心率
	{
		ValueType_t=Value_I2C;
	}
	else if((sensor_type==BodyInfrared_Sensor)||(sensor_type==Sound_Sensor)||(sensor_type==Infrared_Sensor))    //人体红外 声音  红外
	{
		ValueType_t=Value_Switch;
	}
	else
	{
		ValueType_t=Value_ADC;
	}
	return ValueType_t;
}

/*设备相关事项*/

#if defined (ADDR_TWO)|| defined (ADDR_THREE)

/*******************************************************************
*函数:Device_To_Master(uint8_t s_addr, uint8_t des_addr,uint8_t type_sensor,uint8_t count,uint8_t data_sensor)
*功能:节点向主控发送数据包
*输入:uint8_t s_addr :源地址
			uint8_t des_addr :目的地址
			uint8_t type_sensor :传感器类型
			uint8_t count :传感器个数,依据传感器种类决定,如采用温湿度传感器时,个数为2
			uint8_t data_sensor :数据
*返回:无
*特殊说明:
*******************************************************************/
void Device_To_Master(uint8_t s_addr, uint8_t des_addr,uint8_t type_sensor,uint8_t count) //设备向主机发送协议
	
{
	uint8_t DEVICE_TX_BUF[USART2_REC_LEN]={0};
	uint8_t len=0;
	ValueType ValueType_t;
	
	DEVICE_TX_BUF[0]=START;
	DEVICE_TX_BUF[1]=s_addr;
	DEVICE_TX_BUF[2]=des_addr; 

	DEVICE_TX_BUF[4]=type_sensor;
	DEVICE_TX_BUF[5]=count;

	ValueType_t=ValueTypes(type_sensor);
	
	switch(ValueType_t)
	{
		case Value_ADC:
			sprintf((char *)(DEVICE_TX_BUF+6),"%d%c%d%c",vol/100,'.',vol%100/10,'v');			
			break;
		case Value_Switch:
			sprintf((char *)(DEVICE_TX_BUF+6),"%d",switching);
			break;
		case Value_I2C:
			sprintf((char *)(DEVICE_TX_BUF+6),"%c%d%c%c%c%d",'T',sensor_tem,',','R','H',sensor_hum);
			break;
		default:
			break;
	}
	len=strlen((const char *)(DEVICE_TX_BUF+6))+1+6;
	DEVICE_TX_BUF[3]=len;
	DEVICE_TX_BUF[len]=CHK(DEVICE_TX_BUF,len);

	
//	MAX3485_ConTx() ; 
//	USART2_SendArr(DEVICE_TX_BUF,len+1);
//	MAX3485_ConRx();
	
	USART1_SendArr(DEVICE_TX_BUF,len+1);
	
	
}

/*******************************************************************
*函数:Device_Deal_Master(void)
*功能:节点处理主控下发的数据包
*输入:无
*返回:累加和
*特殊说明:
*******************************************************************/
void Device_Deal_Master(void) //设备处理主机下发协议
{
	uint8_t DEVICE_RX_BUF[USART2_REC_LEN]={0};
	uint8_t len=0;
	uint8_t des_addr=0,s_addr=0;
	uint8_t cmd=0;
	
	memset(DEVICE_RX_BUF,0x00,USART2_REC_LEN);
	memcpy(DEVICE_RX_BUF,USART2_RX_BUF,USART2_REC_LEN);
	
	len=DEVICE_RX_BUF[3];
	des_addr=DEVICE_RX_BUF[2];
	cmd=DEVICE_RX_BUF[4];
	s_addr=DEVICE_RX_BUF[1];

	if(DEVICE_RX_BUF[0]==START)
	{
		if(DEVICE_RX_BUF[len]==CHK(DEVICE_RX_BUF,len))
		{
			if(des_addr==M3_Addr)
			{
				switch(cmd)
					{
						case CMD_READ_SENSOR:
							Device_To_Master(M3_Addr, s_addr,Sensor_Type_t,sensor_number);				  
							break;
						
						case CMD_CONTROL_RELAY:
							Relay1_Status=DEVICE_RX_BUF[5];
						  Relay2_Status=DEVICE_RX_BUF[6];
						  Relay3_Status=DEVICE_RX_BUF[7];
						
						  Relay1_Status?LED1_ON:LED1_OFF;
							Relay2_Status?LED2_ON:LED2_OFF;
						  Relay3_Status?LED3_ON:LED3_OFF;
						
							break;
						
						default:
							break;	
					}
			}

		}
	}
}

#endif

/*主机相关事项*/

#ifdef ADDR_ONE

/*******************************************************************
*函数:void Master_To_Device(uint8_t des_addr,uint8_t cmd,uint8_t relay1_status,uint8_t relay2_status,uint8_t relay3_status)
*功能:主控向节点发送数据包
*输入:uint8_t des_addr :目的地址
			uint8_t cmd :命令,1代表读取传感器数据;2代表控制节点继电器
			uint8_t relay1_status:继电器1状态(1代表开,0代表关)
      uint8_t relay2_status:继电器2状态(1代表开,0代表关)
			uint8_t relay3_status:继电器3状态(1代表开,0代表关)			
*返回:无
*特殊说明:
*******************************************************************/
void Master_To_Device(uint8_t des_addr,uint8_t cmd,uint8_t relay1_status,uint8_t relay2_status,uint8_t relay3_status) //主机向设备发送协议
{
	memset(MASTER_TX_BUF,0x00,USART2_DATA_FIFO_BUF_SIZE);
	
	MASTER_TX_BUF[0]=START;
	MASTER_TX_BUF[1]=M3_Addr_1;
	MASTER_TX_BUF[2]=des_addr;
	MASTER_TX_BUF[3]=MASTER_TX_BUF_LEN;
	MASTER_TX_BUF[4]=cmd;
	switch(cmd)
	{
		case CMD_READ_SENSOR:
			MASTER_TX_BUF[5]=0x00;
			MASTER_TX_BUF[6]=0x00;
			MASTER_TX_BUF[7]=0x00;
			break;
		
		case CMD_CONTROL_RELAY:
			MASTER_TX_BUF[5]=relay1_status;
			MASTER_TX_BUF[6]=relay2_status;
			MASTER_TX_BUF[7]=relay3_status;
		  Relay1_Status=MASTER_TX_BUF[5];
		  Relay2_Status=MASTER_TX_BUF[6];
		  Relay3_Status=MASTER_TX_BUF[7];
			break;
		
		default:
			return;		
	}
  MASTER_TX_BUF[8]=CHK(MASTER_TX_BUF,MASTER_TX_BUF_LEN);
	
//	MAX3485_ConTx() ; 
	USART2_SendArr(MASTER_TX_BUF,9);
//	MAX3485_ConRx();	
	
	memset(MASTER_TX_BUF,0x00,USART2_DATA_FIFO_BUF_SIZE);
}

/*******************************************************************
*函数:Master_Deal_Device(void)
*功能:主控处理节点上发的数据包
*输入:无			
*返回:无
*特殊说明:
*******************************************************************/
void Master_Deal_Device(void) //主机处理设备上发协议
{
	uint8_t MASTER_RX_BUF[USART2_DATA_FIFO_BUF_SIZE]={0};
	uint8_t USART2_RX_DATA[USART2_DATA_FIFO_BUF_SIZE] = {0};
	uint8_t len=0;
	uint8_t s_addr=0;
	
	memset(USART2_RX_DATA,0x00,USART2_DATA_FIFO_BUF_SIZE);
	int usart2_data_len = usart2_data_fifo_len();
	while(1)
	{
		if(usart2_data_fifo_is_empty()) break;
		usart2_data_fifo_read(USART2_RX_DATA, usart2_data_len);
		
	}
	
	
	memset(MASTER_RX_BUF,0x00,USART2_DATA_FIFO_BUF_SIZE);
	memcpy(MASTER_RX_BUF,USART2_RX_DATA, usart2_data_len);
	
	len=MASTER_RX_BUF[3];
	s_addr=MASTER_RX_BUF[2];
	
	
	if(MASTER_RX_BUF[0]==START)
	{
		if(MASTER_RX_BUF[len]==CHK(MASTER_RX_BUF,len))
		{
			if(s_addr!=GATEWAY_ADDR)
			{
				Type_Sensor=MASTER_RX_BUF[4];
//			Count_Sensor=MASTER_RX_BUF[5];
			strcpy((char *)MASTER_DATA,(const char *)(MASTER_RX_BUF+6));
			}
			else
			{
				return;
			}
			
		}
	}
	
}


/*******************************************************************
*函数:Master_Deal_Gateway(void)
*功能:主控处理网关下发的数据包
*输入:无			
*返回:无
*特殊说明:
*******************************************************************/
void Master_Deal_Gateway(void) //主机处理网关下发协议
{
	uint8_t MASTER_RX_BUF[USART2_DATA_FIFO_BUF_SIZE]={0};
	uint8_t USART2_RX_DATA[USART2_DATA_FIFO_BUF_SIZE] = {0};
	uint8_t len=0;
	uint8_t cmd=0;
	uint8_t d_addr=0;
	
	int usart2_data_len = usart2_data_fifo_len();
	memset(USART2_RX_DATA,0x00,USART2_DATA_FIFO_BUF_SIZE);
	while(1)
	{
		if(usart2_data_fifo_is_empty()) break;
		usart2_data_fifo_read(USART2_RX_DATA, usart2_data_len);
		
	}
	
	memset(MASTER_RX_BUF,0x00,USART2_DATA_FIFO_BUF_SIZE);
	memcpy(MASTER_RX_BUF,USART2_RX_DATA, usart2_data_len);
	
	len=MASTER_RX_BUF[3];
	d_addr=MASTER_RX_BUF[2];
	
	if(MASTER_RX_BUF[0]==START)
	{
		if(MASTER_RX_BUF[len]==CHK(MASTER_RX_BUF,len))
		{
			if(MASTER_RX_BUF[1]==GATEWAY_ADDR)
			{
				cmd=MASTER_RX_BUF[4];
				
				switch(cmd)
				{
					case CMD_READ_SENSOR:
						Master_To_Device(d_addr,CMD_READ_SENSOR,0,0,0);
						Master_Deal_Device();
//						Master_To_Gateway(d_addr);
					
						break;
					case CMD_CONTROL_RELAY:
						Relay1_Status=MASTER_RX_BUF[5];
					  Relay2_Status=MASTER_RX_BUF[6];
					  Relay3_Status=MASTER_RX_BUF[7];
						
						Master_To_Device(d_addr,CMD_CONTROL_RELAY,Relay1_Status,Relay2_Status,Relay3_Status);//主控向节点发送控制
						break;
					default:
						break;
					
				}
				
			}
		}
	}
	
}
// can 
/*******************************************************************
*函数:Master_To_Gateway(void)   
*功能:把板子自己的传感器数据上报至网关
*输入:无			
*返回:无
*特殊说明:
*******************************************************************/

void Master_To_Gateway(uint16_t StdId,ValueType Value_Type,uint16_t vol,uint8_t  switching,uint16_t sensor_hum,uint16_t sensor_tem ) //CAN节点网关上发协议到网关 以便于在云平台展示
{

	memset(MASTER_TX_BUF,0x00,USART2_DATA_FIFO_BUF_SIZE);
	MASTER_TX_BUF[0]=START;
	MASTER_TX_BUF[1]=(uint8_t)StdId&0x00ff;    //取低两位做ID
	MASTER_TX_BUF[2]=StdId>>8;                 //高位在后
	MASTER_TX_BUF[3]=CMD;
	MASTER_TX_BUF[4]=LEN;
	MASTER_TX_BUF[5]=Sensor_Type_t;
	switch(Value_Type)
	{
		case Value_ADC:	
			    /*.......答题区8开始.......................................*/
          //1.根据协议将vol值正确封装到	MASTER_TX_BUF[]数组中。
					MASTER_TX_BUF[6] = vol >> 8;
					MASTER_TX_BUF[7] = vol;
		
		
		
		      /*.......答题区8结束.......................................*/
			break;
		case Value_Switch:
					MASTER_TX_BUF[6] = 0x00;
					MASTER_TX_BUF[7] = switching;
			break;
		case Value_I2C:
			    MASTER_TX_BUF[6]=sensor_tem;
					MASTER_TX_BUF[7]=sensor_hum;
//			sprintf((char *)(DEVICE_TX_BUF+6),"%c%d%c%c%c%d",'T',sensor_tem,',','R','H',sensor_hum);
			break;
		default:
			break;
	}
	MASTER_TX_BUF[8]=CHK(MASTER_TX_BUF,8);
	MAX3485_ConTx(); 
	USART2_SendArr(MASTER_TX_BUF,LEN);
	MAX3485_ConRx();
	printf("发送本机传感器数据至网关 MASTER_TX_BUF = %02X %02X %02X %02X %02X %02X %02X %02X %02X  \r\n",MASTER_TX_BUF[0],MASTER_TX_BUF[1],MASTER_TX_BUF[2],MASTER_TX_BUF[3],MASTER_TX_BUF[4],MASTER_TX_BUF[5],MASTER_TX_BUF[6],MASTER_TX_BUF[7],MASTER_TX_BUF[8]);
}
/*******************************************************************
*函数:Master_To_Gateway(void)   
*功能:把CAN总线上面的传感数据上报到网关
*输入:无			
*返回:无
*特殊说明:
*******************************************************************/
void CAN_Master_To_Gateway( uint8_t *can_data,uint8_t len)
{
	memset(MASTER_TX_BUF,0x00,USART2_DATA_FIFO_BUF_SIZE);
	MASTER_TX_BUF[0]=START;
	MASTER_TX_BUF[1]=can_data[3];
	MASTER_TX_BUF[2]=can_data[4];
	MASTER_TX_BUF[3]=CMD;
	MASTER_TX_BUF[4]=LEN;
	
	/*.......答题区9开始.......................................*/
  //1.根据协议将终端节点上的传感器类型和传感器数据正确封装到MASTER_TX_BUF[]数组中。
	MASTER_TX_BUF[5] = can_data[0];
	MASTER_TX_BUF[6] = can_data[1];
	MASTER_TX_BUF[7] = can_data[2];
	
	
	/*.......答题区9结束.......................................*/
	

//sprintf((char *)(DEVICE_TX_BUF+6),"%c%d%c%c%c%d",'T',sensor_tem,',','R','H',sensor_hum);
	MASTER_TX_BUF[8]=CHK(MASTER_TX_BUF,8);
	
	MAX3485_ConTx() ; 
	USART2_SendArr(MASTER_TX_BUF,LEN);
	MAX3485_ConRx();	
	printf("发送CAN节点数据至网关 MASTER_TX_BUF = %02X %02X %02X %02X %02X %02X %02X %02X %02X \r\n\r\n",MASTER_TX_BUF[0],MASTER_TX_BUF[1],MASTER_TX_BUF[2],MASTER_TX_BUF[3],MASTER_TX_BUF[4],MASTER_TX_BUF[5],MASTER_TX_BUF[6],MASTER_TX_BUF[7],MASTER_TX_BUF[8]);

}

#endif

ps:题目和代码均来自新大陆,发布目的当作学习笔记,如侵权联系删除。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐