ESP8266之TCP透传
模块:esp-01s
SDK版本:ESP8266_RTOS_SDK-3.0
开发环境:wsl+vscode
功能模块:wifi,tcp_client,uart
什么是透传?
透传,即透明传输(pass-through),指的是在通讯中不管传输的业务内容如何,只负责将传输的内容由源地址传输到目的地址,而不对业务数据内容做任何改变。
本次所要实现的功能是从串口输入消息,并通过esp8266转发到tcp server。
串口部分uart_echo.c代码如下
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/uart.h"
#include "esp_log.h"
#include "tcp_client.h"
#define EX_UART_NUM UART_NUM_0
#define BUF_SIZE (2048)
#define RD_BUF_SIZE (BUF_SIZE)
static const char *TAG = "uart_events";
static QueueHandle_t uart0_queue;
static void uart_event_task(void *pvParameters)
{
uart_event_t event;
size_t buffered_size;
uint8_t *dtmp = (uint8_t *) malloc(RD_BUF_SIZE);
for (;;) {
// Waiting for UART event.
if (xQueueReceive(uart0_queue, (void *)&event, (portTickType)portMAX_DELAY)) {
bzero(dtmp, RD_BUF_SIZE);
switch (event.type) {
case UART_DATA: //有数据
uart_read_bytes(EX_UART_NUM, dtmp, event.size, portMAX_DELAY);//读取数据
SendString((char *)dtmp);//读取到的数据发送给tcp输出
uart_write_bytes(EX_UART_NUM, (const char *) dtmp, event.size);//输出数据
break;
case UART_FIFO_OVF: //检测到硬件 FIFO 溢出事件
ESP_LOGI(TAG, "hw fifo overflow");
uart_flush_input(EX_UART_NUM);//清空缓冲区,接收更多数据
xQueueReset(uart0_queue);
break;
case UART_BUFFER_FULL: //UART 环形缓冲器事件已满
ESP_LOGI(TAG, "ring buffer full");
uart_flush_input(EX_UART_NUM);//清空缓冲区,接收更多数据
xQueueReset(uart0_queue);
break;
case UART_PARITY_ERR://UART 队列错误
ESP_LOGI(TAG, "uart parity error");
break;
case UART_FRAME_ERR://UART 帧错误事件
ESP_LOGI(TAG, "uart frame error");
break;
default:// Others
ESP_LOGI(TAG, "uart event type: %d", event.type);
break;
}
}
}
free(dtmp);
dtmp = NULL;
vTaskDelete(NULL);
}
void uart_start() //串口初始化
{
uart_config_t uart_config = {
.baud_rate = 74880, //波特率
.data_bits = UART_DATA_8_BITS,//数据位
.parity = UART_PARITY_DISABLE,//串口队列使能
.stop_bits = UART_STOP_BITS_1,//停止位
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE //流控关
};
uart_param_config(EX_UART_NUM, &uart_config);
//安装 UART 驱动程序, 并获得队列。
uart_driver_install(EX_UART_NUM, BUF_SIZE * 2, BUF_SIZE * 2, 100, &uart0_queue);
//从 ISR 创建处理 UART 事件的任务
xTaskCreate(uart_event_task, "uart_event_task", 2048, NULL, 12, NULL);
}
引出头文件uart_echo.h如下
void uart_start();