第一次提交:完成了网关的单路485数据采集,还有以太网链接和MQTT配置,实现数据上报和命令下发,差一个断网储存

This commit is contained in:
Wang Beihong
2026-02-01 18:31:06 +08:00
commit b284cb4953
35 changed files with 4338 additions and 0 deletions

View File

@@ -0,0 +1,66 @@
// RS-485-SP3485EEN.h
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "nvs_flash.h"
#include "driver/uart.h"
#include "freertos/queue.h"
#include "esp_log.h"
#include "driver/gpio.h"
typedef struct
{
uart_port_t uart_num;
gpio_num_t tx_pin;
gpio_num_t rx_pin;
gpio_num_t de_re_pin;
char name[20];
} rs485_channel_t;
/**
* @brief RS-485-SP3485EEN.h
* DE和RE引脚接在一起使用默认是下拉通过控制DE_RE引脚的高低电平来控制发送和接收
* DE_RE = HIGH 发送数据,接收器使能,低电平有效。低电平时使能接收器,高电平时禁用接收器
* DE_RE = LOW 接收数据,驱动器(发送器)使能,高电平有效。高电平时使能发送器,低电平时禁用发送器
*
* 所以默认是接收状态发送数据时需要先将DE_RE引脚拉高发送完数据后再拉低
*/
// 第一个模块的引脚配置
#define RS_485_SP3485EEN_UART_PORT (UART_NUM_0)
#define RS_485_SP3485EEN_RO_PIN (GPIO_NUM_41) // 接收器输出。将总线上的差分信号转换为TTL电平输出给 单片机RX
#define RS_485_SP3485EEN_DE_RE_PIN (GPIO_NUM_42) // 数据使能,接收器使能。控制发送器和接收器是否工作
#define RS_485_SP3485EEN_DI_PIN (GPIO_NUM_44) // 驱动器输入。单片机TX 发送的TTL电平信号转换为总线上的差分信号
// 第二个模块的引脚配置
#define RS_485_SP3485EEN_2_UART_PORT (UART_NUM_2)
#define RS_485_SP3485EEN_2_RO_PIN (GPIO_NUM_43) // 接收器输出。将总线上的差分信号转换为TTL电平输出给 单片机RX
#define RS_485_SP3485EEN_2_DE_RE_PIN (GPIO_NUM_2) // 数据使能,接收器使能。控制发送器和接收器是否工作
#define RS_485_SP3485EEN_2_DI_PIN (GPIO_NUM_1) // 驱动器输入。单片机TX 发送的TTL电平信号转换为总线上的差分信号
// 公共配置
#define BUF_SIZE 256
#define BAUD_RATE 115200
// 通道数量常量
#define RS485_NUM_CHANNELS 2
// ----------------------------
// 通道数组
// ----------------------------
extern rs485_channel_t rs485_channels[];
#define NUM_CHANNELS RS485_NUM_CHANNELS
void RS_485_init(uart_port_t uart_num, int tx_pin, int rx_pin, int de_re_pin);
void init_specific_rs485_channel(int channel_num); // 新增函数声明
void init_all_rs485_channels(void);
void rs485_send(uart_port_t uart_num, const uint8_t *data, size_t len);
int rs485_receive(uart_port_t uart_num, uint8_t *buffer, size_t buf_size, uint32_t timeout_ms);
BaseType_t start_rs485_rx_task_for_channel(int channel_num, UBaseType_t priority, uint32_t stack_size);