新大陆 1+X传感网中级(基于CAN总线通信技术和BasicRF通信技术的环境监控系统)
(注意:数据域应该按照实际采集的数据进行填写。(注意:数据域应该按照实际采集的数据进行填写。(注意:数据域应该按照实际采集的数据进行填写。文件夹中的串口调试助手打印火焰传感器数据并将截图保存至。的火焰传感器数据,按照高位在前低位在后正确封装赋值给。)将云平台上实时显示传感器数据信息的界面截图保存至。通信协议报文,将采集到的火焰传感器数据正确的填入。函数中实现:将转换好的火焰传感器数据通过以下表。网
接线图

ZigBee传感器采集节点代码编写:
(1)在“fire_sensor.c”文件中配置BasicRF无线通信的参数为:RF_CHANNEL为20,PAN_ID为准考证号后4位。比如准考证号为20610003254400409876,则PAN_ID为0x9876
(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:题目和代码均来自新大陆,发布目的当作学习笔记,如侵权联系删除。
更多推荐



所有评论(0)