修改驱动程序
This commit is contained in:
1 parent
063c3fcc07
commit
a69c1a58d6
39 files changed
+1627
-641
No files matched your search
@@ -0,0 +1,17 @@
|
||||
#include "util.h"
|
||||
|
||||
|
||||
float Bytes2Float(char * data)
|
||||
{
|
||||
Float ff ;
|
||||
ff.byte[0] = data[1];
|
||||
ff.byte[1] = data[0];
|
||||
ff.byte[2] = data[3];
|
||||
ff.byte[3] = data[2];
|
||||
return ff.data;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
#ifndef _UTIL_H
|
||||
#define _UTIL_H
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
typedef union {
|
||||
uint32_t data;
|
||||
char byte[4];
|
||||
} Int;
|
||||
typedef union {
|
||||
float data;
|
||||
char byte[4];
|
||||
} Float;
|
||||
|
||||
|
||||
float Bytes2Float(char * data);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -47,6 +47,8 @@ static const ef_env default_env_set[] = {
|
||||
{"mqtt_port", "1883"},
|
||||
{"boot_times", "0"},
|
||||
{"jump_boot_time", "10"}, // BOOT 等待时间 10s
|
||||
{"net_drv", "dtu"}, // mqtt dtu ec200
|
||||
{"eth2_chann", "1"}, //以太网通道2
|
||||
|
||||
// 传感器基础参数配置
|
||||
{"di1", "0"},// 0 表示未定义 1 表示 上限位,2:下限位 3: 开关4:关 5:停止
|
||||
|
||||
@@ -1643,8 +1643,8 @@ void ef_print_env(void)
|
||||
|
||||
env_iterator(&env, &using_size, NULL, print_env_cb);
|
||||
|
||||
ef_print("\nmode: next generation\n");
|
||||
ef_print("size: %lu/%lu bytes.\n", using_size + (SECTOR_NUM - EF_GC_EMPTY_SEC_THRESHOLD) * SECTOR_HDR_DATA_SIZE,
|
||||
ef_print("\nmode: next generation\r\n");
|
||||
ef_print("size: %lu/%lu bytes.\r\n", using_size + (SECTOR_NUM - EF_GC_EMPTY_SEC_THRESHOLD) * SECTOR_HDR_DATA_SIZE,
|
||||
ENV_AREA_SIZE - SECTOR_SIZE * EF_GC_EMPTY_SEC_THRESHOLD);
|
||||
|
||||
/* unlock the ENV cache */
|
||||
|
||||
@@ -22,11 +22,24 @@ int modbus_m_read_regist(uint8_t id,uint16_t addr,uint16_t length,uint8_t * data
|
||||
return index;
|
||||
}
|
||||
|
||||
//// 解析通过03 命令读取回来额寄存器数据
|
||||
//int modbus_m_read_regist_ack(uint)
|
||||
//{
|
||||
//
|
||||
//}
|
||||
|
||||
|
||||
// 写入寄存器
|
||||
// addr 寄存器地址
|
||||
// id 丛机地址
|
||||
// length 读取丛机数据长度
|
||||
int modbus_m_write_regist(uint8_t id,uint16_t addr,uint16_t key,uint8_t * data)
|
||||
{
|
||||
uint16_t index = 0,crc;
|
||||
data[index++] = id;
|
||||
data[index++] = 0x06;
|
||||
data[index++] = (addr >> 8) & 0x00FF;
|
||||
data[index++] = addr & 0x00FF;
|
||||
data[index++] = (key >> 8) & 0x00FF;
|
||||
data[index++] = key & 0x00FF;
|
||||
crc = MX_CRC_CALC(data,index);
|
||||
data[index++] = crc & 0x00FF;
|
||||
data[index++] = (crc >> 8) & 0x00FF;
|
||||
return index;
|
||||
}
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
|
||||
int modbus_m_read_regist(uint8_t id,uint16_t addr,uint16_t length,uint8_t * data);
|
||||
int modbus_m_write_regist(uint8_t id,uint16_t addr,uint16_t key,uint8_t * data);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
/* modbus 从机实现*/
|
||||
|
||||
#include<stdint.h>
|
||||
#include "crc.h"
|
||||
#include "modbus-s.h"
|
||||
|
||||
#if !defined(LOG_TAG)
|
||||
#define LOG_TAG "main"
|
||||
#endif
|
||||
#include <elog.h>
|
||||
|
||||
|
||||
void ModbusSlaveInit(ModBusSlave_t * drv,uint8_t ID,uint8_t * data,uint16_t * reg,uint16_t max)
|
||||
{
|
||||
drv->ID = ID;
|
||||
drv->data = data ;
|
||||
drv->reg = reg;
|
||||
drv->regmax = max;
|
||||
}
|
||||
|
||||
// 解析modbus 数据
|
||||
//-1 地址错误
|
||||
int ModbusSlaveHandle(ModBusSlave_t * drv,uint8_t * data,uint16_t length )
|
||||
{
|
||||
uint16_t rcrc = 0,ccrc = 0 ;
|
||||
if( (data[0] != drv->ID) && (data[0] != 0x00))
|
||||
{
|
||||
// 地址错误
|
||||
return -1;
|
||||
}
|
||||
rcrc = ((uint16_t)data[length- 1] << 8) + (uint16_t)data[length- 2] ;
|
||||
ccrc = MX_CRC_CALC(data,length-2);
|
||||
if (rcrc != ccrc )
|
||||
{
|
||||
log_e("rcrc:%04X,ccrc:%04X\r\n",rcrc,ccrc) ;
|
||||
return -2;
|
||||
}
|
||||
drv->func = data[1] ;
|
||||
|
||||
switch (drv->func)
|
||||
{
|
||||
case 0x03 :// 读取保持寄存器地址
|
||||
{
|
||||
drv->Addr = ((uint16_t)data[2] << 8) + data[3];
|
||||
drv->length = ((uint16_t)data[4] << 8) + data[5];
|
||||
break;
|
||||
}
|
||||
case 0x04:
|
||||
break;
|
||||
case 0x06: // 写入单个保持寄存器
|
||||
drv->Addr = ((uint16_t)data[2] << 8) + data[3];
|
||||
drv->data[0] = data[4];
|
||||
drv->data[1] = data[5];
|
||||
break;
|
||||
default:
|
||||
return -3 ;
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
// if() // 寄存器最大值
|
||||
}
|
||||
// 从机数据应答
|
||||
int ModbusSlavePacket(ModBusSlave_t * drv,uint8_t *data)
|
||||
{
|
||||
int tx_size = 0;
|
||||
uint16_t crc = 0;
|
||||
data[tx_size++] = drv->ID;
|
||||
data[tx_size++] = drv->func;
|
||||
char * p = (char *)&drv->reg[drv->Addr];
|
||||
switch (drv->func)
|
||||
{
|
||||
case 0x03:
|
||||
data[tx_size++] = drv->length *2;
|
||||
for(int i =0;i < drv->length *2;i++)
|
||||
{
|
||||
data[tx_size++] = *p;
|
||||
p++;
|
||||
}
|
||||
break;
|
||||
case 0x06: //
|
||||
data[tx_size++] = (drv->Addr >> 8) & 0x00FF;
|
||||
data[tx_size++] = drv->Addr & 0x00FF;
|
||||
data[tx_size++] = drv->data[0];
|
||||
data[tx_size++] = drv->data[1];
|
||||
break;
|
||||
default :
|
||||
break;
|
||||
}
|
||||
crc = MX_CRC_CALC(data,tx_size);
|
||||
data[tx_size++] = crc & 0x00FF;
|
||||
data[tx_size++] = (crc >> 8) & 0x00FF;
|
||||
return tx_size;
|
||||
}
|
||||
|
||||
//// 读取保持寄存器的值
|
||||
//// addr 寄存器地址
|
||||
//// id 丛机地址
|
||||
//// length 读取丛机数据长度
|
||||
//int modbus_m_read_regist(uint8_t id,uint16_t addr,uint16_t length,uint8_t * data)
|
||||
//{
|
||||
// uint16_t index = 0,crc;
|
||||
// data[index++] = id;
|
||||
// data[index++] = 0x03;
|
||||
// data[index++] = (addr >> 8) & 0x00FF;
|
||||
// data[index++] = addr & 0x00FF;
|
||||
// data[index++] = (length >> 8) & 0x00FF;
|
||||
// data[index++] = length & 0x00FF;
|
||||
// crc = MX_CRC_CALC(data,index);
|
||||
// data[index++] = crc & 0x00FF;
|
||||
// data[index++] = (crc >> 8) & 0x00FF;
|
||||
// return index;
|
||||
//}
|
||||
|
||||
//// 解析通过03 命令读取回来额寄存器数据
|
||||
//int modbus_m_read_regist_ack(uint)
|
||||
//{
|
||||
//
|
||||
//}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
#ifndef _MODBUS_S_H
|
||||
#define _MODBUS_S_H
|
||||
#include "stm32g0xx_hal.h"
|
||||
|
||||
|
||||
|
||||
// modbus 支持的最大地址
|
||||
#define MODBUS_S_MAX_ADDR 0X000A
|
||||
|
||||
|
||||
typedef struct ModBusSlave_t{
|
||||
uint8_t ID; // 从机地址
|
||||
uint8_t func;
|
||||
uint16_t Addr; // 寄存器地址
|
||||
uint16_t length; // 寄存器长度
|
||||
uint8_t * data; // 写入的数据
|
||||
uint16_t crc; // crc
|
||||
uint16_t * reg;// 寄存器
|
||||
uint16_t regmax;
|
||||
} ModBusSlave_t;
|
||||
|
||||
|
||||
void ModbusSlaveInit(ModBusSlave_t * drv,uint8_t ID,uint8_t * data,uint16_t * reg,uint16_t max);
|
||||
int ModbusSlaveHandle(ModBusSlave_t * drv,uint8_t * data,uint16_t length );
|
||||
int ModbusSlavePacket(ModBusSlave_t * drv,uint8_t *data);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
Reference in new issue
Block a user