设备准备
- PC机一个
- 网关一个
- RS-485通信节点三个(三个M3主控模块,一个作为主机,两个从机)
- 火焰传感器一个
- 可燃气体传感器一个
- USB转485调试器一个
一、云平台配置






二、节点固件下载

一路next到……



三、硬件连线

实物连接图

代码分析
// 硬件抽象层初始化
HAL_Init();
// 系统时钟配置
SystemClock_Config();
// GPIO口初始化(包括LED,KEY1,KEY2,蜂鸣器)
MX_GPIO_Init();
// 初始化USMART(函数控制管理初始化)
usmart_dev.init();
// ADC初始化
MX_ADC1_Init();
// 定时器3初始化
MX_TIM3_Init();
// 初始化内部SRAM
my_men_init(SRAMIN);
// 初始化modbus16进制
mb_init(M_FRAME_CHECK_CRC16);
// 传感器初始化,开机获取上次传感器保存状态
Sensor_Init();
while (1)
{
// modbus协议应用程序
getsensor_task();
// 获取传感器数值应用程序
app_modbus_slave();
}
void getsensor_task(void)
{
static uint32_t getsensor_value_time;
static uint32_t getsensor_set_time;
uint8_t res;
if ((uint32_t)(HAL_GetTick() - getsensor_value_time >= 500))
{
getsensor_value_time = HAL_GetTick();
//printf("test getsensor_value_time");
// 传递传感器类型获取传感器数据
get_sensor(sen_type_t);
}
if ((uint32_t)(HAL_GetTick() - getsensor_set_time >= 100))
{
getsensor_set_time = HAL_GetTick();
//printf("test change_sensor_state");
res = change_sensor_state(&sen_type_t);
}
}
void app_modbus_slave(void)
{
uint8_t res;
m_frame_typedef rxframe;
static uint32_t slaveaddress_set_time;
if (m_ctrl_dev.frameok == 1)
{
// 解包,判断地址是否是自己的,判断功能吗
// 根据功能码调用相应的函数去读取寄存器的值,封装发给主机
res = mb_unpack_frame(&rxframe);
if (res == MR_OK) //解析包成功
{
printf("解析包成功\r\n");
}
else if (res == MR_FRAME_FORMAT_ERR)
{
printf("帧格式错误\r\n");
}
else if (res == MR_FRAME_CHECK_ERR)
{
printf("帧校验错误\r\n");
}
else if (res == MR_FRAME_SLAVE_ADDRESS)
{
printf("从机地址错误\r\n");
}
else if (res == MR_FRANE_ILLEGAL_FUNCTION)
{
printf("功能码错误\r\n");
}
}
// 配置节点地址
if ((uint32_t)(HAL_GetTick() - slaveaddress_set_time >= 100))
{
slaveaddress_set_time = HAL_GetTick();
//printf("slaveaddress_set_time\r\n");
change_address_state(&SLAVE_ADDRESS);
}
}
程序流程


