STM32_WGY/User/485_sensor.c

1031 lines
27 KiB
C
Raw Permalink Normal View History

2025-04-03 15:29:20 +08:00
/*
*********************************************************************************************************
* IAR Development Kits
* on the
*
* M451
*
* Filename : spi_adc.c
* Version : V1.00
* Programmer(s) : Qian Xianghong
*********************************************************************************************************
*/
#include "includes.h"
// <20>Ƿ<EFBFBD>SMARC<52><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//#define _SMARC_FLOWMETER_
//#define RS485_EN() LL_GPIO_SetOutputPin(GPIOB, LL_GPIO_PIN_2);
//#define RS485_DIS() LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_2);
// <20><>ȡ<EFBFBD><C8A1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
volatile uint32_t modbus_outTick = 0;
const uint8_t VACUUM_ID[] = {1, 2}; // <20><><EFBFBD>ռ<EFBFBD>ͨ<EFBFBD>ŵ<EFBFBD>ַ
#define VACUUM_CMD 4 // <20><><EFBFBD>ռƶ<D5BC>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
#define VACUUM_ADDR 608 // <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>ʼ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
#define VACUUM_LEN 8 // <20><><EFBFBD>ռƶ<D5BC>ȡ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const uint8_t LEAK_ID = 3; // й¶<D0B9><C2B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ŵ<EFBFBD>ַ
#define LEAK_CMD 3 // й¶<D0B9><C2B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
#define LEAK_ADDR 0x08 // й¶<D0B9><C2B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
#define LEAK_LEN 8 // й¶<D0B9><C2B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const uint8_t FLOW_ID = 4; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ŵ<EFBFBD>ַ
#ifndef _SMARC_FLOWMETER_
#define FLOW_CMD 3 // <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
#define FLOW_ADDR 0 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
#define FLOW_LEN 15 // <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>ȡ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#else
#define FLOW_CMD 3 // <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
#define FLOW_ADDR 4068 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
#define FLOW_LEN 12 // <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>ȡ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#endif
const uint8_t LEAK_O2_ID = 1; // O2Ũ<32>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>ŵ<EFBFBD>ַ
#define LEAK_O2_SOF 0xFF // O2Ũ<32>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
#define LEAK_O2_CMD 0x86 // O2Ũ<32>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
#pragma pack(push, 1)
typedef struct
{
uint8_t id;
uint8_t cmd;
uint16_t addr;
uint16_t len;
uint16_t crc;
} modbus_send_t;
typedef struct
{
struct
{
uint8_t id;
uint8_t cmd;
uint8_t len;
} header;
union{
// <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>
struct
{
uint16_t staVacuum; // ״̬
uint16_t lifeVacuum; // ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint32_t vacuum; // <20><><EFBFBD>նȣ<D5B6>float<61>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ν<EFBFBD><CEBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
uint32_t rateVacuum; // ©<><C2A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>float<61>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ν<EFBFBD><CEBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
uint32_t tempr; // <20>ȣ<C2B6>float<61>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ν<EFBFBD><CEBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
} vacuum;
// й©<D0B9><C2A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
struct
{
unsigned unit : 4; // <20><><EFBFBD>嵥λ
unsigned ratio : 4; // <20><>ֵ<EFBFBD><D6B5>λ
uint8_t type; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t A1; // A1<41><31><EFBFBD><EFBFBD>ֵ
uint16_t A2;
uint16_t A3;
uint16_t A4;
uint16_t range; // <20><><EFBFBD><EFBFBD>
uint16_t concentrations; // Ũ<><C5A8>
uint8_t staLeak; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
unsigned : 8;
} leak;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
struct
{
uint32_t nM3_int; // <20><><EFBFBD><EFBFBD><EFBFBD>ۻ<EFBFBD><DBBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t nM3_frac; // <20><><EFBFBD><EFBFBD><EFBFBD>ۻ<EFBFBD><DBBB><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD><D6A3>Ŵ<EFBFBD>10000<30><30><EFBFBD><EFBFBD>
uint32_t M3_int; // <20><><EFBFBD><EFBFBD><EFBFBD>ۻ<EFBFBD><DBBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint16_t M3_frac; // <20><><EFBFBD><EFBFBD><EFBFBD>ۻ<EFBFBD><DBBB><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD><D6A3>Ŵ<EFBFBD>10000<30><30><EFBFBD><EFBFBD>
uint32_t nM3_h; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>nM3/h<><68><EFBFBD>Ŵ<EFBFBD>100<30><30><EFBFBD><EFBFBD>
uint32_t M3_h; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>M3/h<><68><EFBFBD>Ŵ<EFBFBD>100<30><30><EFBFBD><EFBFBD>
int16_t tempr; // <20>ȣ<C2B6><C8A3><EFBFBD>Ŵ<EFBFBD>10<31><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һλ<D2BB><CEBB><EFBFBD><EFBFBD>λ(<28><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>0x7FFFΪ<46><CEAA>)<29><>
uint32_t pressure; // ѹ<><D1B9>(<28><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>KPa, <20>Ŵ<EFBFBD>10<31><30>)
uint16_t err1; // <20><EFBFBD><ECB3A3>־λ1
//<2F>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD>־λ: 0x0003
//ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־λ: 0x0030
//<2F><><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD>ͱ<EFBFBD>־λ: 0x0300
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󹤿<EFBFBD><F3B9A4BF><EFBFBD><EFBFBD><EFBFBD>: 0x3000
//<2F><><EFBFBD><EFBFBD><ECB3A3>0x0000
uint16_t err2; // <20><EFBFBD><ECB3A3>־λ2
//<2F><EFBFBD><E6B4A2><EFBFBD><EFBFBD><ECB3A3>־λ: 0x0003
//<2F><><EFBFBD><EFBFBD><ECB3A3>0x0000
} flow;
// SMARC<52><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
struct
{
uint32_t nM3_h; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: float, <20><><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>uint32_t<5F>ͽ<EFBFBD><CDBD><EFBFBD>
uint32_t M3_h; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: float, <20><><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>uint32_t<5F>ͽ<EFBFBD><CDBD><EFBFBD>
uint32_t tempr; // <20><EFBFBD>: float, <20><><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>uint32_t<5F>ͽ<EFBFBD><CDBD><EFBFBD>
uint32_t pressure; // ѹ<><D1B9>: float, <20><><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>uint32_t<5F>ͽ<EFBFBD><CDBD><EFBFBD>
uint16_t warnFlag; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
uint8_t nM3_BCD[6]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
} flow_SMARC;
};
uint16_t crc; // ռλ<D5BC><CEBB>
} modbus_recv_t;
typedef union
{
modbus_send_t send;
modbus_recv_t recv;
uint8_t buff[sizeof(modbus_recv_t)];
} modbus_comm_t;
// O2Ũ<32>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
typedef struct
{
uint8_t addr;
uint8_t cmd;
uint8_t reserved[5];
} leak_o2_send_t;
// O2Ũ<32>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD>
typedef struct
{
uint8_t cmd;
uint16_t concentrations; // Ũ<><C5A8>
uint8_t reserved[4];
} leak_o2_recv_t;
// O2Ũ<32>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>֡
typedef union
{
struct
{
uint8_t sof;
union
{
leak_o2_send_t send;
leak_o2_recv_t recv;
};
uint8_t cs;
};
uint8_t buff[9];
} leak_o2_comm_t;
// DYQ-7ͨ<37><CDA8>Э<EFBFBD><D0AD><EFBFBD><EFBFBD>й¶<D0B9><C2B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲɼ<DDB2>ͷ<EFBFBD><CDB7>ѹ<EFBFBD><D1B9><EFBFBD>ɼ<EFBFBD>ͷ<EFBFBD><CDB7>
#define RS_MIN_FRAME_LEN (15)
#define RS_MAX_FRAME_LEN (39)
#define RS_MIN_DATA_LEN (0)
#define RS_MAX_DATA_LEN (RS_MAX_FRAME_LEN - RS_MIN_FRAME_LEN)
#define RS_FRAME_SOF (0x1B) // <20><>ʶһ<CAB6><D2BB>֡<EFBFBD>Ŀ<EFBFBD>ʼ
#define RS_DIR_M2S (0) // Master->Slave
#define RS_DIR_S2M (1) // Slave->Master
#define RS_PROTOCOL_VER_1 (1)
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define RS_CMD_READ_DATA (5) // <20><><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define RS_RESULT_SUCC (0) // <20><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
#define RS_RESULT_FAIL (-1) // <20><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
// ͨ<><CDA8>Э<EFBFBD><D0AD><EFBFBD>
const uint8_t RS_PROTOCOL_VER = RS_PROTOCOL_VER_1;
// 485й¶<D0B9><C2B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
typedef struct // size = RS_MAX_FRAME_LEN
{
uint8_t sof; // RS_FRMAE_SOF
uint8_t len; // bytes from sof to crc<72><63>RS_MIN_FRAME_LEN~RS_MAX_FRAME_LEN<45><4E>
uint8_t destAddr;
uint8_t srcAddr;
uint8_t srcPSN[6];
uint8_t dir;
uint8_t protocol_ver; // RS_PROTOCOL
uint8_t cmd;
uint8_t data[RS_MAX_DATA_LEN];
uint16_t crc; // ռλ<D5BC>ã<EFBFBD>ʵ<EFBFBD><CAB5>crc<72><63><EFBFBD>ܸ<EFBFBD><DCB8><EFBFBD>ǰ
} rs_frame_t;
// 485й¶<D0B9><C2B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
typedef struct // size = 20
{
uint16_t adc; // <20>ɼ<EFBFBD>ADCֵ
float measureValue; // <20>ɼ<EFBFBD>ֵ
uint8_t measureState; // <20><><EFBFBD><EFBFBD>ֵ״̬
uint16_t levelHeight; // Һλ<D2BA>߶<EFBFBD>
uint16_t volume; // ʣ<><CAA3>Һ<EFBFBD><D2BA>
uint16_t volumeMax; // <20><>Ч<EFBFBD>ݻ<EFBFBD>
uint16_t quality; // ʣ<><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t warnState; // <20><><EFBFBD><EFBFBD>״̬
uint16_t envAdc; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ADC
int16_t envTempr; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
} rs_data_t;
#pragma pack(pop)
rs_frame_t RS_TranFrame;
modbus_comm_t modbus;
uint8_t modbus_idx = 0;
uint8_t vaccum_idx = 0;
data_sample_t *modbus_sample;
leak_o2_comm_t leakO2;
// <20><>ʮ<EFBFBD><CAAE><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>BCD
void dec2bcd(uint32_t dec, uint8_t *bcd, uint8_t len)
{
char fmt[10], str[20];
uint8_t i;
// <20><><EFBFBD>ɸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD>磺%010u<30><75>
sprintf(fmt, "%%0%du", len * 2);
// <20><>decֵת<D6B5><D7AA><EFBFBD><EFBFBD>ǰ<EFBFBD>油0<E6B2B9><30><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>磺000000123456)
sprintf(str, fmt, dec);
// ת<><D7AA>
for(i = 0; i < strlen(str); i += 2)
{
bcd[i / 2] = ((str[i] - '0') << 4) | (str[i + 1] - '0');
}
}
// <20><><EFBFBD><EFBFBD>O2Ũ<32>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>
uint8_t leak_o2_calcuCS(uint8_t *data, uint16_t len)
{
uint8_t cs = 0;
while(len--)
cs += *data++;
return (~cs) + 1;
}
// <20><>ʼ<EFBFBD><CABC>O2Ũ<32><C5A8>ͨ<EFBFBD><CDA8>֡
void leak_o2_init_frame(leak_o2_comm_t *frame)
{
memset(frame, 0, sizeof(leak_o2_comm_t));
frame->sof = LEAK_O2_SOF;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD>Zhang Jm<4A><6D><EFBFBD><EFBFBD><E1B9A9><EFBFBD><EFBFBD><EFBFBD>ڶԶ<DAB6><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD>ڹ<EFBFBD><DAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ-2<><32>0.01Pa<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/**
* @brief Function of Fuzzy Processing.
* @param value: vacuun value.
* @retval None.
*/
float Mode1_Fuzzy_Process(float value)
{
static const float beta1 = -0.2539755;
static const float beta2 = 13.15659;
static const float theta = 0.011666666;
static const float eta = 0.9999999;
static const float kappa = 0.006666666;
float temp1, temp2, result, lower_t = 0.0101;
if((value < 0.09f) && (value > 0.04f))
{
temp1 = -beta1 * value;
temp2 = beta2 * pow(value, 2.0);
return(1 - exp(temp1 - temp2));
}
else if((value <= 0.04f) && (value > 0.005f))
{/*y = theta*x^eta/(kappa^eta+x^eta)*/
temp1 = pow(value, eta);
temp2 = pow(kappa, eta) + temp1;
result = theta * temp1 / temp2;
if(result < lower_t)
return(lower_t);
else
return(result);
}
else
return(value);
}
void Modbus_Read(USART_Handle *huart)
{
uint8_t i;
uint32_t reversed;
int32_t i_reversed;
float f;
uint8_t c = (uint8_t) huart->Instance->RDR;
/* Receive data */
if(modbus_idx < sizeof(modbus_recv_t))
{
modbus.buff[modbus_idx++] = c;
if(modbus.recv.header.id == LEAK_ID && modbus.recv.header.cmd == LEAK_CMD
&& modbus.recv.header.len == sizeof(modbus.recv.leak)
&& modbus_idx == sizeof(modbus.recv.header) + sizeof(modbus.recv.leak) + sizeof(modbus.recv.crc)
&& MODBUS_RTU_CRC16(modbus.buff, modbus_idx) == 0)
{
/* Print the received data */
// printf("Received data:\n");
// for(i = 0; i < modbus_idx; i++)
// {
// printf("%02X ", modbus.buff[i]);
// }
// printf("\n");
// ̽<><CCBD><EFBFBD><EFBFBD>״̬
modbus_sample->leak.staLeak = modbus.recv.leak.staLeak;
// Ũ<><C5A8>
modbus_sample->leak.concentrations = ntohs(modbus.recv.leak.concentrations);
if(modbus.recv.leak.ratio == 1)
modbus_sample->leak.concentrations /= 10;
else if(modbus.recv.leak.ratio == 2)
modbus_sample->leak.concentrations /= 100;
else if(modbus.recv.leak.ratio == 3)
modbus_sample->leak.concentrations /= 1000;
// <20>˳<EFBFBD><CBB3><EFBFBD>ʱ<EFBFBD>ȴ<EFBFBD>
modbus_outTick = GetDelayTick(0);
}
else if(modbus.recv.header.id == VACUUM_ID[vaccum_idx] && modbus.recv.header.cmd == VACUUM_CMD
&& modbus.recv.header.len == sizeof(modbus.recv.vacuum)
&& modbus_idx == sizeof(modbus.recv.header) + sizeof(modbus.recv.vacuum) + sizeof(modbus.recv.crc)
&& MODBUS_RTU_CRC16(modbus.buff, modbus_idx) == 0)
{
/* Print the received data */
printf("Received data:\n");
for(i = 0; i < modbus_idx; i++)
{
printf("%02X ", modbus.buff[i]);
}
printf("\n");
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
modbus_sample->vacuum[vaccum_idx].staVacuum = ntohs(modbus.recv.vacuum.staVacuum);
// ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
modbus_sample->vacuum[vaccum_idx].lifeVacuum = ntohs(modbus.recv.vacuum.lifeVacuum);
// <20><><EFBFBD>ն<EFBFBD>
reversed = ntohl(modbus.recv.vacuum.vacuum);
memmove(&modbus_sample->vacuum[vaccum_idx].vacuum, &reversed, sizeof(modbus_sample->vacuum[vaccum_idx].vacuum));
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2021.10.28<EFBFBD><EFBFBD>
modbus_sample->vacuum[vaccum_idx].vacuum = Mode1_Fuzzy_Process(modbus_sample->vacuum[vaccum_idx].vacuum);
// ©<><C2A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
reversed = ntohl(modbus.recv.vacuum.rateVacuum);
memmove(&modbus_sample->vacuum[vaccum_idx].rateVacuum, &reversed, sizeof(modbus_sample->vacuum[vaccum_idx].rateVacuum));
// <20><EFBFBD>
reversed = ntohl(modbus.recv.vacuum.tempr);
memmove(&modbus_sample->vacuum[vaccum_idx].tempr, &reversed, sizeof(modbus_sample->vacuum[vaccum_idx].tempr));
// <20>˳<EFBFBD><CBB3><EFBFBD>ʱ<EFBFBD>ȴ<EFBFBD>
modbus_outTick = GetDelayTick(0);
}
#ifndef _SMARC_FLOWMETER_
else if(modbus.recv.header.id == FLOW_ID && modbus.recv.header.cmd == FLOW_CMD
&& modbus.recv.header.len == sizeof(modbus.recv.flow)
&& modbus_idx == sizeof(modbus.recv.header) + sizeof(modbus.recv.flow) + sizeof(modbus.recv.crc)
&& MODBUS_RTU_CRC16(modbus.buff, modbus_idx) == 0)
{
// /* Print the received data */
// printf("Received data:\n");
// for(i = 0; i < modbus_idx; i++)
// {
// printf("%02X ", modbus.buff[i]);
// }
// printf("\n");
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BCD<43><EFBFBD>Ŵ<EFBFBD>100<30><30><EFBFBD><EFBFBD>
if((htons(modbus.recv.flow.err2) & 0x000F) == 0x0003) // <20>Ƿ<EFBFBD><C7B7><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dec2bcd(0, modbus_sample->flow.nM3, 6);
else
{
reversed = ntohl(modbus.recv.flow.nM3_int); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dec2bcd(reversed, modbus_sample->flow.nM3, 5);
reversed = ntohs(modbus.recv.flow.nM3_frac); // С<><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
reversed /= 100; // <20>Ŵ<EFBFBD>10000<30><30>-><3E>Ŵ<EFBFBD>100<30><30>
dec2bcd(reversed, modbus_sample->flow.nM3 + 5, 1);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BCD<43><EFBFBD>Ŵ<EFBFBD>100<30><30><EFBFBD><EFBFBD>
reversed = ntohl(modbus.recv.flow.nM3_h);
dec2bcd(reversed, modbus_sample->flow.nM3_h, 4);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BCD<43><EFBFBD>Ŵ<EFBFBD>100<30><30><EFBFBD><EFBFBD>
reversed = ntohl(modbus.recv.flow.M3_h);
dec2bcd(reversed, modbus_sample->flow.M3_h, 4);
// <20>ȣ<C2B6>BCD<43><EFBFBD>Ŵ<EFBFBD>100<30><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ֽ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ţ<EFBFBD> 80H Ϊ<><CEAA><EFBFBD><EFBFBD>00H Ϊ<><CEAA><EFBFBD><EFBFBD>
if((htons(modbus.recv.flow.err1) & 0x000F) == 0x0003) // <20>Ƿ<EFBFBD><C7B7>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
i_reversed = 0;
else
{
i_reversed = ntohs(modbus.recv.flow.tempr);
i_reversed *= 10; // <20>Ŵ<EFBFBD>10<31><30>-><3E>Ŵ<EFBFBD>100<30><30>
}
if(i_reversed >= 0)
dec2bcd(i_reversed, modbus_sample->flow.tempr, 4);
else
{
dec2bcd(-i_reversed, modbus_sample->flow.tempr, 4);
modbus_sample->flow.tempr[0] = 0x80;
}
// ѹ<><D1B9><EFBFBD><EFBFBD>BCD<43><EFBFBD>Ŵ<EFBFBD>100<30><30><EFBFBD><EFBFBD>
if((htons(modbus.recv.flow.err1) & 0x00F0) == 0x0030) // <20>Ƿ<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
reversed = 0;
else
{
reversed = ntohl(modbus.recv.flow.pressure);
reversed *= 10; // <20>Ŵ<EFBFBD>10<31><30>-><3E>Ŵ<EFBFBD>100<30><30>
}
dec2bcd(reversed, modbus_sample->flow.pressure, 4);
/* Print the converted bcd data */
printf("Flowmeter BCD data:\n");
for(i = 0; i < sizeof(modbus_sample->flow); i++)
{
printf("%02X ", *(((uint8_t *) &modbus_sample->flow) + i));
}
printf("\n");
// <20>˳<EFBFBD><CBB3><EFBFBD>ʱ<EFBFBD>ȴ<EFBFBD>
modbus_outTick = GetDelayTick(0);
}
#else
else if(modbus.recv.header.id == FLOW_ID && modbus.recv.header.cmd == FLOW_CMD
&& modbus.recv.header.len == sizeof(modbus.recv.flow_SMARC)
&& modbus_idx == sizeof(modbus.recv.header) + sizeof(modbus.recv.flow_SMARC) + sizeof(modbus.recv.crc)
&& MODBUS_RTU_CRC16(modbus.buff, modbus_idx) == 0)
{
// /* Print the received data */
// printf("Received data:\n");
// for(i = 0; i < modbus_idx; i++)
// {
// printf("%02X ", modbus.buff[i]);
// }
// printf("\n");
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
reversed = 0;
for(i = 0; i < 9; i++)
{
reversed *= 10;
if(i % 2 == 0)
reversed += (modbus.recv.flow_SMARC.nM3_BCD[i / 2] >> 4);
else
reversed += (modbus.recv.flow_SMARC.nM3_BCD[i / 2] & 0x0F);
}
dec2bcd(reversed, modbus_sample->flow.nM3, 5);
// С<><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
reversed = 0;
for(i = 9; i < 11; i++)
{
reversed *= 10;
if(i % 2 == 0)
reversed += (modbus.recv.flow_SMARC.nM3_BCD[i / 2] >> 4);
else
reversed += (modbus.recv.flow_SMARC.nM3_BCD[i / 2] & 0x0F);
}
dec2bcd(reversed, modbus_sample->flow.nM3 + 5, 1);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
reversed = ntohl(modbus.recv.flow_SMARC.nM3_h);
memmove(&f, &reversed, 4);
reversed = f * 100;
dec2bcd(reversed, modbus_sample->flow.nM3_h, 4);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
reversed = ntohl(modbus.recv.flow_SMARC.M3_h);
memmove(&f, &reversed, 4);
reversed = f * 100;
dec2bcd(reversed, modbus_sample->flow.M3_h, 4);
// <20><EFBFBD>
reversed = ntohl(modbus.recv.flow_SMARC.tempr);
memmove(&f, &reversed, 4);
i_reversed = f * 100;
if(i_reversed >= 0)
dec2bcd(i_reversed, modbus_sample->flow.tempr, 4);
else
{
dec2bcd(-i_reversed, modbus_sample->flow.tempr, 4);
modbus_sample->flow.tempr[0] = 0x80;
}
// ѹ<><D1B9>
reversed = ntohl(modbus.recv.flow_SMARC.pressure);
memmove(&f, &reversed, 4);
reversed = f * 100;
dec2bcd(reversed, modbus_sample->flow.pressure, 4);
/* Print the converted bcd data */
printf("Flowmeter BCD data:\n");
for(i = 0; i < sizeof(modbus_sample->flow); i++)
{
printf("%02X ", *(((uint8_t *) &modbus_sample->flow) + i));
}
printf("\n");
// <20>˳<EFBFBD><CBB3><EFBFBD>ʱ<EFBFBD>ȴ<EFBFBD>
modbus_outTick = GetDelayTick(0);
}
#endif
}
}
void LeakO2_Read(USART_Handle *huart)
{
uint8_t i;
uint8_t c = (uint8_t) huart->Instance->RDR;
uint16_t concentrations = 0;
/* Receive data */
if(modbus_idx < sizeof(leak_o2_comm_t))
{
leakO2.buff[modbus_idx++] = c;
if(modbus_idx == sizeof(leak_o2_comm_t)
&& leakO2.sof == LEAK_O2_SOF && leakO2.recv.cmd == LEAK_O2_CMD
&& leak_o2_calcuCS(leakO2.buff + 1, sizeof(leak_o2_comm_t) - 2) == leakO2.cs)
{
/* Print the received data */
printf("Received data:\n");
for(i = 0; i < modbus_idx; i++)
{
printf("%02X ", leakO2.buff[i]);
}
printf("\n");
#if 1
// Ũ<><C5A8>: <20>ֱ<EFBFBD><D6B1><EFBFBD>0.1%
concentrations = ntohs(leakO2.recv.concentrations);
#else
// <20><><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
concentrations = 240;
#endif
// Ũ<>Ƚ<EFBFBD><C8BD><EFBFBD>21.5%<25><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>й¶<D0B9><C2B6><EFBFBD><EFBFBD>
if(concentrations <= 215)
Leak_Alarm_Enabled = 1;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>Ũ<EFBFBD>ȴﵽ23%
if(concentrations >= 230)
{
modbus_sample->leak.staLeak = LEAK_STATUS_A2_ALARM;
modbus_sample->leak.concentrations = 1;
}
else
{
modbus_sample->leak.staLeak = LEAK_STATUS_OK;
modbus_sample->leak.concentrations = 0;
}
// <20>˳<EFBFBD><CBB3><EFBFBD>ʱ<EFBFBD>ȴ<EFBFBD>
modbus_outTick = GetDelayTick(0);
}
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3>
uint8_t rs_phy_valid(rs_frame_t *frame)
{
if(frame->protocol_ver != RS_PROTOCOL_VER || frame->dir != RS_DIR_S2M)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3>ʧ<EFBFBD><CAA7>
return 0;
}
return 1;
}
// mac<61><63>У<EFBFBD><D0A3>
uint8_t rs_mac_valid(rs_frame_t *frame, uint8_t dir)
{
if(frame->destAddr != dcBuff.configBottle.addr)
{
// mac<61><63>У<EFBFBD><D0A3>ʧ<EFBFBD><CAA7>
return 0;
}
return 1;
}
// <20><>ʼ<EFBFBD><CABC>֡
void rs_initial_frame(rs_frame_t *frame)
{
memset((uint8_t *) frame, 0, sizeof(rs_frame_t));
frame->len = RS_MIN_FRAME_LEN;
}
// ׷<>Ӹ<EFBFBD><D3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t rs_append_data(rs_frame_t *frame, uint8_t *data, uint8_t len)
{
if(frame->len < RS_MIN_FRAME_LEN || frame->len + len > RS_MAX_FRAME_LEN)
return 0;
if(len > 0)
memmove(frame->data + (frame->len - RS_MIN_FRAME_LEN), data, len);
frame->len += len;
return 1;
}
// <20><><EFBFBD><EFBFBD>Ѱ<EFBFBD><D1B0>SOF
void RS_SearchSOF(uint8_t *buf, uint16_t fromPos, uint8_t *len)
{
uint8_t i;
for(i = fromPos; i < *len && buf[i] != RS_FRAME_SOF; i++)
{
}
*len -= i;
memmove(buf, buf + i, *len);
}
// ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void RS_ParseFrame(USART_Handle *huart)
{
uint8_t *RS_ModuleData = (uint8_t *) &RS_TranFrame;
uint16_t i;
uint8_t frameOk, frameErr;
uint8_t c = (uint8_t) huart->Instance->RDR;
uint32_t mask;
rs_data_t *rsData = (rs_data_t *) (RS_TranFrame.data + sizeof(mask));
if(modbus_idx == 0 && c != RS_FRAME_SOF)
return;
RS_ModuleData[modbus_idx++] = c;
do
{
frameErr = (modbus_idx >= 2 &&
(RS_ModuleData[1] < RS_MIN_FRAME_LEN || RS_ModuleData[1] > RS_MAX_FRAME_LEN));
if(frameErr)
{
// <20><>1<EFBFBD><31>ʼѰ<CABC><D1B0>SOF
RS_SearchSOF(RS_ModuleData, 1, &modbus_idx);
}
frameOk = (modbus_idx >= 2 && RS_ModuleData[1] >= RS_MIN_FRAME_LEN && RS_ModuleData[1] <= RS_MAX_FRAME_LEN
&& modbus_idx >= RS_ModuleData[1]);
if(frameOk)
{
if(MODBUS_RTU_CRC16(RS_ModuleData, RS_ModuleData[1]) == 0)
{
if(rs_phy_valid(&RS_TranFrame) && rs_mac_valid(&RS_TranFrame, RS_DIR_M2S))
{
// <20>յ<EFBFBD>һ֡
printf("\r\nRS recv %d bytes:\r\n", RS_ModuleData[1]);
for(i = 0; i < RS_ModuleData[1]; i++)
printf(" %02X", RS_ModuleData[i]);
printf("\r\n");
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ֡
memmove(&mask, RS_TranFrame.data, 4);
mask = ntohl(mask);
if(RS_TranFrame.srcAddr == 0x51)
{
// й©<D0B9><C2A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if((mask & 0x61000000) == 0x61000000) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
modbus_sample->leak.typeLeak = LEAK_TYPE_MODBUS;
if(rsData->measureState > 1)
modbus_sample->leak.staLeak = LEAK_STATUS_FAULT;
else if(rsData->warnState == 4)
modbus_sample->leak.staLeak = LEAK_STATUS_A2_ALARM;
else
modbus_sample->leak.staLeak = LEAK_STATUS_OK;
if(rsData->warnState < 3)
modbus_sample->leak.concentrations = 0;
else
{
memmove(&mask, &rsData->measureValue, 4);
mask = ntohl(mask);
memmove(&rsData->measureValue, &mask, 4);
modbus_sample->leak.concentrations = rsData->measureValue / 1000;
}
}
}
else if(RS_TranFrame.srcAddr == 0x31)
{
// <20><>ѹ/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3>ڲɼ<DAB2>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if((mask & 0xE0000000) == 0xE0000000) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if(dcBuff.configDisplay.op_USE_CAPACITY_SENSOR)
{
// <20><><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD>ֻҪ<D6BB><D2AA><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>ܹ<EFBFBD>һ<EFBFBD><D2BB>״̬
modbus_sample->staDPress.status = SENSOR_STATUS_NORMAL;
}
else
modbus_sample->staDPress.status = rsData->measureState;
modbus_sample->adDPress = ntohs(rsData->adc);
modbus_sample->diff = ntohf(rsData->measureValue);
if(dcBuff.configDisplay.op_USE_CAPACITY_SENSOR)
{
// <20><><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD>С<CEBB><D0A1>
modbus_sample->diff = ((int16_t) (modbus_sample->diff * 10)) * 0.1;
}
}
}
else if(RS_TranFrame.srcAddr == 0x41)
{
// ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3>ڲɼ<DAB2>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if((mask & 0xE0000000) == 0xE0000000) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
modbus_sample->staPress.status = rsData->measureState;
modbus_sample->adPress = ntohs(rsData->adc);
modbus_sample->pressure = ntohf(rsData->measureValue);
}
}
// <20>˳<EFBFBD><CBB3><EFBFBD>ʱ<EFBFBD>ȴ<EFBFBD>
modbus_outTick = GetDelayTick(0);
}
// <20><><EFBFBD><EFBFBD>Ѱ<EFBFBD><D1B0><EFBFBD><EFBFBD>һ֡
modbus_idx -= RS_ModuleData[1];
memmove(RS_ModuleData, RS_ModuleData + RS_ModuleData[1], modbus_idx);
// <20><>0<EFBFBD><30>ʼѰ<CABC><D1B0>SOF
RS_SearchSOF(RS_ModuleData, 0, &modbus_idx);
}
else
{
// <20><>1<EFBFBD><31>ʼѰ<CABC><D1B0>SOF
RS_SearchSOF(RS_ModuleData, 1, &modbus_idx);
}
}
} while(frameOk || frameErr);
}
void Sensor_Init()
{
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA);
/**LPUART1 GPIO Configuration
PA2 ------> LPUART1_TX
PA3 ------> LPUART1_RX
PB1 ------> LPUART1_DE
*/
GPIO_InitStruct.Pin = LL_GPIO_PIN_2|LL_GPIO_PIN_3;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_MEDIUM;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_8;
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB);
GPIO_InitStruct.Pin = LL_GPIO_PIN_1;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_MEDIUM;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_8;
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
//RS485_DIS();
}
void Sensor_Open(uint32_t baudrate)
{
LL_LPUART_InitTypeDef LPUART_InitStruct = {0};
/* Peripheral clock enable */
LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_LPUART1);
NVIC_SetPriority(LPUART1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),5, 0));
NVIC_EnableIRQ(LPUART1_IRQn);
LPUART_InitStruct.BaudRate = baudrate;
LPUART_InitStruct.DataWidth = LL_LPUART_DATAWIDTH_8B;
LPUART_InitStruct.StopBits = LL_LPUART_STOPBITS_1;
LPUART_InitStruct.Parity = LL_LPUART_PARITY_NONE;
LPUART_InitStruct.TransferDirection = LL_LPUART_DIRECTION_TX_RX;
LPUART_InitStruct.HardwareFlowControl = LL_LPUART_HWCONTROL_NONE;
LL_LPUART_Init(LPUART1, &LPUART_InitStruct);
LL_LPUART_EnableDEMode(LPUART1);
LL_LPUART_SetDESignalPolarity(LPUART1, LL_LPUART_DE_POLARITY_HIGH);
LL_LPUART_SetDEAssertionTime(LPUART1, 0);
LL_LPUART_SetDEDeassertionTime(LPUART1, 0);
SET_BIT(LPUART1->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE);
LL_LPUART_Enable(LPUART1);
}
// <20>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Modubsͨ<73><CDA8>ģʽ
void Modbus_Open()
{
LL_LPUART_Disable(hlpuart1.Instance);
// <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
hlpuart1.RxISR = Modbus_Read;
// <20>޸IJ<DEB8><C4B2><EFBFBD><EFBFBD><EFBFBD>
Sensor_Open(9600);
}
// <20>л<EFBFBD><D0BB><EFBFBD>O2Ũ<32>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>ģʽ
void LeakO2_Open()
{
LL_LPUART_Disable(hlpuart1.Instance);
// <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
hlpuart1.RxISR = LeakO2_Read;
// <20>޸IJ<DEB8><C4B2><EFBFBD><EFBFBD><EFBFBD>
Sensor_Open(9600);
}
// <20>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DYQ-7ͨ<37><CDA8>ģʽ
void Modbus_Close()
{
LL_LPUART_Disable(hlpuart1.Instance);
// <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
hlpuart1.RxISR = RS_ParseFrame;
// <20>޸IJ<DEB8><C4B2><EFBFBD><EFBFBD><EFBFBD>
Sensor_Open(19200);
}
static void RS485_SendDataByte(uint8_t *pu8TxBuf, uint32_t u32WriteBytes)
{
// RS485_EN();
// delay_us(1);
// <20><><EFBFBD>ó<EFBFBD>ʱ<EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>
modbus_outTick = GetDelayTick(500);
UART_Transmit_IT(&hlpuart1, pu8TxBuf, u32WriteBytes);
// delay_ms(9); // <20><><EFBFBD><EFBFBD>8ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>9ms
// RS485_DIS();
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B7A2>
uint8_t rs_uart_send(rs_frame_t *frame, uint8_t destAddr, uint8_t dir)
{
uint16_t crc;
uint8_t i;
// <20><>д<EFBFBD>̶<EFBFBD><CCB6>ֶ<EFBFBD>
frame->sof = RS_FRAME_SOF;
frame->destAddr = destAddr;
frame->srcAddr = dcBuff.configBottle.addr;
memmove(frame->srcPSN, dcBuff.configBottle.PSN, 6);
frame->dir = dir;
frame->protocol_ver = RS_PROTOCOL_VER;
crc = MODBUS_RTU_CRC16((uint8_t *) frame, frame->len - 2);
((uint8_t *) frame)[frame->len - 2] = crc >> 8;
((uint8_t *) frame)[frame->len - 1] = crc & 0xFF;
printf("\r\nRS send %d bytes:\r\n", frame->len);
for(i = 0; i < frame->len; i++)
printf(" %02X", ((uint8_t *) frame)[i]);
printf("\r\n");
RS485_SendDataByte((uint8_t *) frame, frame->len);
return 1;
}
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>
void Sensor_ReadVacuum(uint8_t sensorIdx, data_sample_t *sample)
{
Modbus_Open();
// Ĭ<>϶<EFBFBD>ȡʧ<C8A1><CAA7>
sample->vacuum[sensorIdx].staVacuum = VACUUM_STATUS_COMM_FAULT;
sample->vacuum[sensorIdx].lifeVacuum = 0;
sample->vacuum[sensorIdx].vacuum = 0;
sample->vacuum[sensorIdx].rateVacuum = 0;
// <20><>ʼ<EFBFBD><CABC>
modbus_sample = sample;
vaccum_idx = sensorIdx;
modbus_idx = 0;
// <20><><EFBFBD><EFBFBD>
modbus.send.id = VACUUM_ID[sensorIdx];
modbus.send.cmd = VACUUM_CMD;
modbus.send.addr = htons(VACUUM_ADDR - 1);
modbus.send.len = htons(VACUUM_LEN);
modbus.send.crc = htons(MODBUS_RTU_CRC16(modbus.buff, sizeof(modbus_send_t) - 2));
RS485_SendDataByte(modbus.buff, sizeof(modbus_send_t));
// <20>ȴ<EFBFBD><C8B4>жϴ<D0B6><CFB4><EFBFBD>
}
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void Sensor_ReadFlow(data_sample_t *sample)
{
Modbus_Open();
// Ĭ<>϶<EFBFBD>ȡʧ<C8A1><CAA7>
memset(&sample->flow, 0, sizeof(sample->flow));
// <20><>ʼ<EFBFBD><CABC>
modbus_sample = sample;
modbus_idx = 0;
// <20><><EFBFBD><EFBFBD>
modbus.send.id = FLOW_ID;
modbus.send.cmd = FLOW_CMD;
modbus.send.addr = htons(FLOW_ADDR);
modbus.send.len = htons(FLOW_LEN);
modbus.send.crc = htons(MODBUS_RTU_CRC16(modbus.buff, sizeof(modbus_send_t) - 2));
RS485_SendDataByte(modbus.buff, sizeof(modbus_send_t));
// <20>ȴ<EFBFBD><C8B4>жϴ<D0B6><CFB4><EFBFBD>
}
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void Sensor_ReadLeakO2(data_sample_t *sample)
{
uint8_t reSample = 0;
LeakO2_Open();
// Ĭ<>϶<EFBFBD>ȡʧ<C8A1><CAA7>
sample->leak.staLeak = LEAK_STATUS_COMM_FAULT;
sample->leak.concentrations = 0;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
sample->leak.typeLeak = LEAK_TYPE_SWITCH | LEAK_TYPE_CURRENT | LEAK_TYPE_MODBUS;
// <20><>ʼ<EFBFBD><CABC>
modbus_sample = sample;
modbus_idx = 0;
// <20><><EFBFBD><EFBFBD>
leak_o2_init_frame(&leakO2);
leakO2.send.addr = LEAK_O2_ID;
leakO2.send.cmd = LEAK_O2_CMD;
leakO2.cs = leak_o2_calcuCS(leakO2.buff + 1, sizeof(leak_o2_comm_t) - 2);
RS485_SendDataByte(leakO2.buff, sizeof(leak_o2_comm_t));
// <20>ȴ<EFBFBD><C8B4>жϴ<D0B6><CFB4><EFBFBD>
}
// <20><>ȡй©<D0B9><C2A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void Sensor_ReadLeak(data_sample_t *sample)
{
uint8_t reSample = 0;
Modbus_Close();
// Ĭ<>϶<EFBFBD>ȡʧ<C8A1><CAA7>
sample->leak.staLeak = LEAK_STATUS_COMM_FAULT;
sample->leak.concentrations = 0;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
sample->leak.typeLeak = LEAK_TYPE_SWITCH | LEAK_TYPE_CURRENT | LEAK_TYPE_MODBUS;
// <20><>ʼ<EFBFBD><CABC>
modbus_sample = sample;
modbus_idx = 0;
// <20><><EFBFBD><EFBFBD>
#if 0
modbus.send.id = LEAK_ID;
modbus.send.cmd = LEAK_CMD;
modbus.send.addr = htons(LEAK_ADDR);
modbus.send.len = htons(LEAK_LEN);
modbus.send.crc = htons(MODBUS_RTU_CRC16(modbus.buff, sizeof(modbus_send_t) - 2));
RS485_SendDataByte(modbus.buff, sizeof(modbus_send_t));
#else
rs_initial_frame(&RS_TranFrame);
RS_TranFrame.cmd = RS_CMD_READ_DATA;
rs_append_data(&RS_TranFrame, (uint8_t *) &reSample, 1);
rs_uart_send(&RS_TranFrame, 0x50, RS_DIR_M2S);
#endif
// <20>ȴ<EFBFBD><C8B4>жϴ<D0B6><CFB4><EFBFBD>
}
// <20><>ȡ<EFBFBD><C8A1>ѹ/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void Sensor_ReadDPress(data_sample_t *sample)
{
uint8_t reSample = 0;
Modbus_Close();
// Ĭ<>϶<EFBFBD>ȡʧ<C8A1><CAA7>
sample->staDPress.status = SENSOR_STATUS_NOCONNECT;
sample->adDPress = 0;
sample->diff = 0;
// <20><>ʼ<EFBFBD><CABC>
modbus_sample = sample;
modbus_idx = 0;
// <20><><EFBFBD><EFBFBD>
rs_initial_frame(&RS_TranFrame);
RS_TranFrame.cmd = RS_CMD_READ_DATA;
rs_append_data(&RS_TranFrame, (uint8_t *) &reSample, 1);
rs_uart_send(&RS_TranFrame, 0x31, RS_DIR_M2S);
// <20>ȴ<EFBFBD><C8B4>жϴ<D0B6><CFB4><EFBFBD>
}
// <20><>ȡѹ<C8A1><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void Sensor_ReadPress(data_sample_t *sample)
{
uint8_t reSample = 0;
Modbus_Close();
// Ĭ<>϶<EFBFBD>ȡʧ<C8A1><CAA7>
sample->staPress.status = SENSOR_STATUS_NOCONNECT;
sample->adPress = 0;
sample->pressure = 0;
// <20><>ʼ<EFBFBD><CABC>
modbus_sample = sample;
modbus_idx = 0;
// <20><><EFBFBD><EFBFBD>
rs_initial_frame(&RS_TranFrame);
RS_TranFrame.cmd = RS_CMD_READ_DATA;
rs_append_data(&RS_TranFrame, (uint8_t *) &reSample, 1);
rs_uart_send(&RS_TranFrame, 0x41, RS_DIR_M2S);
// <20>ȴ<EFBFBD><C8B4>жϴ<D0B6><CFB4><EFBFBD>
}