83 lines
2.8 KiB
C
83 lines
2.8 KiB
C
|
#include "freertos/FreeRTOS.h"
|
||
|
#include "freertos/task.h"
|
||
|
#include "driver/uart.h"
|
||
|
#include "driver/gpio.h"
|
||
|
#include "esp_log.h"
|
||
|
|
||
|
#include "uart0_modbus_slave.h"
|
||
|
#include "ModbusS.h"
|
||
|
#include "led.h"
|
||
|
|
||
|
static const char *TAG = "UART0";
|
||
|
|
||
|
uint8_t txbuf[BUF_SIZE];
|
||
|
uint8_t rxbuf[BUF_SIZE];
|
||
|
extern uint16_t gWordVar[];
|
||
|
|
||
|
void uart0_init(void)
|
||
|
{
|
||
|
const int uart_num = UART_PORT_NUM;
|
||
|
uart_config_t uart_config = {
|
||
|
.baud_rate = BAUD_RATE,
|
||
|
.data_bits = UART_DATA_8_BITS,
|
||
|
.parity = UART_PARITY_DISABLE,
|
||
|
.stop_bits = UART_STOP_BITS_1,
|
||
|
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
|
||
|
.rx_flow_ctrl_thresh = 122,
|
||
|
.source_clk = UART_SCLK_APB,
|
||
|
};
|
||
|
// Set UART log level
|
||
|
// esp_log_level_set(TAG, ESP_LOG_NONE);
|
||
|
|
||
|
ESP_LOGI(TAG, "Start RS485 application test and configure UART.");
|
||
|
|
||
|
// Install UART driver (we don't need an event queue here)
|
||
|
// In this example we don't even use a buffer for sending data.
|
||
|
ESP_ERROR_CHECK(uart_driver_install(uart_num, BUF_SIZE * 2, BUF_SIZE, 0, NULL, 0));
|
||
|
|
||
|
// Configure UART parameters
|
||
|
ESP_ERROR_CHECK(uart_param_config(uart_num, &uart_config));
|
||
|
ESP_LOGI(TAG, "UART set pins, mode and install driver.");
|
||
|
// Set UART pins as per KConfig settings
|
||
|
//ESP_ERROR_CHECK(uart_set_pin(uart_num, UART_TXD_PIN, UART_RXD_PIN, UART_RTS_PIN, UART_CTS_PIN));之前没解开注释
|
||
|
//ESP_ERROR_CHECK(uart_set_pin(uart_num, 11, 13, 12, -1));
|
||
|
// Set RS485 half duplex mode
|
||
|
ESP_ERROR_CHECK(uart_set_mode(uart_num, UART_MODE_RS485_HALF_DUPLEX));
|
||
|
// Set read timeout of UART TOUT feature
|
||
|
ESP_ERROR_CHECK(uart_set_rx_timeout(uart_num, UART_READ_TOUT));
|
||
|
}
|
||
|
|
||
|
void uart0_modbus_slave_task(void *arg)
|
||
|
{
|
||
|
ESP_LOGI(TAG, "uart0_modbus_slave_task");
|
||
|
|
||
|
while (1)
|
||
|
{
|
||
|
int txlen = 0;
|
||
|
int len = uart_read_bytes(UART_PORT_NUM, rxbuf, BUF_SIZE, UART_READ_TOUT);
|
||
|
// xTaskGetTickCount();
|
||
|
// ESP_LOGI("modbus_slave","-----------------------------rxlen:%d", len);
|
||
|
// for (int i = 0; i < len; i++)
|
||
|
// ESP_LOGI("modbus_slave","uart0 get: 0x%x", rxbuf[i]);
|
||
|
|
||
|
if (len > 0)
|
||
|
{
|
||
|
txlen = ModbusSlaveProcess(txbuf, rxbuf, len, 1);
|
||
|
// if (txlen > 0)
|
||
|
// {
|
||
|
// LED_Toggle(LED1_GPIO_PIN);
|
||
|
// int uart_write_length = uart_write_bytes(UART_PORT_NUM, txbuf, txlen);
|
||
|
// ESP_LOGI("modbus_slave","-----------------------------txlen:%d uart_write_length:%d", txlen, uart_write_length);
|
||
|
// for (int i = 0; i < uart_write_length; i++)
|
||
|
// ESP_LOGI("modbus_slave","uart0 return: 0x%x", txbuf[i]);
|
||
|
// }
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void uart0_modbus_slave_init(void)
|
||
|
{
|
||
|
uart0_init();
|
||
|
xTaskCreate(uart0_modbus_slave_task, "uart0_modbus_slave_task", 4096, NULL, 10, NULL);
|
||
|
}
|