ESP8266之TCP透传

@fsw  September 30, 2018

模块: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();
阅读量:840

添加新评论