云计算百科
云计算领域专业知识百科平台

ESP32连接服务器

温馨提示:如果不想了解过程,直接从第四步开始也能成功

一、ESP32-》PC(串口调试助手):数据互发 

        1、打开串口调试助手

        2、接上esp32和USB转串口(两根数据线,TX接GPIO16,RX接GPIO17,GND接GND,剩下一根线不用管)

        3、在设备管理器中查看串口号,波特率设为115200

        4、接受模式和发送模式要一致(文本模式,UTF-8)

        5、编译、烧录下面的代码

        6、打开监视设备,在串口调试助手进行发送数据,串口调试助手和监视设备都会收到数据

        7、如果接口出现问题,出现两个相同的串口号就卸载重装

        8、如果出现乱码,将串口调试助手和vscode的波特率设为4800,如果还是不行,再改回来(115200)

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/uart.h"
#include "esp_log.h"

#define UART_NUM UART_NUM_1 // 使用 UART1 作为额外的通信串口
#define TXD_PIN 17 // UART1 TX 引脚
#define RXD_PIN 16 // UART1 RX 引脚
#define UART_RX_BUFFER_SIZE 1024

static const char *TAG = "UART Communication";

// UART 配置函数
void uart_init()
{
const uart_config_t uart_config = {
.baud_rate = 115200, // 波特率
.data_bits = UART_DATA_8_BITS, // 数据位
.parity = UART_PARITY_DISABLE, // 无奇偶校验
.stop_bits = UART_STOP_BITS_1, // 停止位
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE, // 禁用硬件流控
.source_clk = UART_SCLK_APB, // 使用 APB 时钟
};

// 配置 UART 参数
ESP_ERROR_CHECK(uart_driver_install(UART_NUM, UART_RX_BUFFER_SIZE, 0, 0, NULL, 0));
ESP_ERROR_CHECK(uart_param_config(UART_NUM, &uart_config));
ESP_ERROR_CHECK(uart_set_pin(UART_NUM, TXD_PIN, RXD_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE));
ESP_LOGI(TAG, "UART initialized successfully");
}

// UART 通信任务
void uart_communication_task(void *param)
{
uint8_t *uart_rx_buffer = (uint8_t *)malloc(UART_RX_BUFFER_SIZE);
if (uart_rx_buffer == NULL)
{
ESP_LOGE(TAG, "Failed to allocate memory for UART RX buffer");
vTaskDelete(NULL);
return;
}

while (1)
{
int length = uart_read_bytes(UART_NUM, uart_rx_buffer, UART_RX_BUFFER_SIZE, pdMS_TO_TICKS(100));
if (length > 0)
{
ESP_LOGI(TAG, "Received %d bytes: %s", length, uart_rx_buffer);
// 回传接收到的数据
uart_write_bytes(UART_NUM, uart_rx_buffer, length);
}
}

free(uart_rx_buffer);
vTaskDelete(NULL);
}

void app_main()
{
// 初始化 UART
uart_init();

// 创建 UART 通信任务
xTaskCreate(uart_communication_task, "uart_communication_task", 2048, NULL, 5, NULL);

// 保留调试串口输出
while (1)
{
printf("Debug message from UART0\\n");
vTaskDelay(pdMS_TO_TICKS(5000));
}
}

二、ESP32-》PC(自己写python脚本):数据互发

         1、接上esp32和USB转串口(两根数据线,TX接GPIO16,RX接GPIO17,GND接GND,剩下一根线不用管)

         2、确保自己已经安装了python程序
              可在终端使用命令:python –version
              如果出现版本号,则已安装,例如:Python 3.9.1
        
         3、在终端运行serial_echo.py文件(下面的代码,一定要转为python文件)(在终端输入命令:python E:\\server.py(地址)),在vscode里面编译烧录一个有输出的代码

              转python文件方法:普通记事本(在保存时选择全部文件,文件名加个后缀.py)
         
         4、若终端出现输出结果,则表示成功

serial_echo.py文件:

import serial
import time

def serial_echo(port, baudrate=115200):
    """
    打开指定的串口,并实现回显功能。
    :param port: 串口号,例如 'COM3'
    :param baudrate: 波特率,默认为 115200
    """
    try:
        # 打开串口
        ser = serial.Serial(port, baudrate, timeout=1)
        
        print(f"串口 {port} 已打开,波特率 {baudrate}")
        print("开始回显功能,按 Ctrl+C 退出")
        
        while True:
            if ser.in_waiting:
                # 读取串口数据
                data = ser.readline().decode('utf-8').strip()
                print(f"接收到数据: {data}")
                # 发送相同的数据回串口
                ser.write(data.encode('utf-8'))
                
    except KeyboardInterrupt:
        print("\\n用户中断")
    except serial.SerialException as e:
        print(f"串口错误: {e}")
    finally:
        # 关闭串口
        if 'ser' in locals():
            ser.close()
        print("串口已关闭")

if __name__ == "__main__":
    import sys
    if len(sys.argv) > 1:
        port = sys.argv[1]
    else:
        port = 'COM3'  # 默认串口号,根据需要修改
    
    serial_echo(port)

三、PC(自己写python脚本)—》服务器:数据互发

        1、创建和保存 Python 脚本文件

              生成一个后缀为.py的python文件,服务器端代码保存为 server.py。
              客户端代码保存为 client.py。

        2、在终端运行server.py和client.py(分别输入命令:python E:\\server.py(地址)和python E:\\client.py)

        3、服务器启动后,你会看到类似以下的输出:
服务器已启动,等待客户端连接…

        4、之后就可以进行数据互发

server.py文件:

import socket
import threading

def handle_client(client_socket, client_address):
print(f"客户端 {client_address} 已连接。")
try:
while True:
data = client_socket.recv(1024)
if not data:
print(f"客户端 {client_address} 已断开连接。")
break
print(f"来自 {client_address} 的消息: {data.decode('utf-8')}")
response = input("请输入回复内容: ")
client_socket.send(response.encode('utf-8'))
finally:
client_socket.close()

def start_server():
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('0.0.0.0', 12345)) # 绑定到所有可用的网络接口,端口为 12345
server.listen(5)
print("服务器已启动,等待客户端连接…")

while True:
client_socket, client_address = server.accept()
client_handler = threading.Thread(target=handle_client, args=(client_socket, client_address))
client_handler.start()

if __name__ == '__main__':
start_server()

client.py文件:

import socket

def start_client():
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('127.0.0.1', 12345) # 服务器的 IP 地址和端口
client.connect(server_address)
print("已连接到服务器。")

try:
while True:
message = input("请输入要发送的消息: ")
client.send(message.encode('utf-8'))
response = client.recv(1024)
print(f"服务器回复: {response.decode('utf-8')}")
finally:
client.close()
print("连接已关闭。")

if __name__ == '__main__':
start_client()

四、ESP32-》服务器:将前面的步骤整合在一起

        1、连接好ESP32开发板,烧录一个有输出的代码
        2、在终端运行server.py(跟上面的server时一样的(输入python E:\\server.py(地址))
        3、在终端运行client2.py (输入python E:\\client2.py(地址))
        4、即可进行输入互发,当ESP32发送一个消息时,服务器接收到并且返回一个消息的时候ESP32才能发送下一个消息

client2.py文件:

import serial
import socket
import threading

def serial_echo(port, baudrate=115200, server_ip='127.0.0.1', server_port=12345):
try:
ser = serial.Serial(port, baudrate, timeout=1)
print(f"串口 {port} 已打开,波特率:{baudrate}")
print("开始数据转发功能。按 Ctrl+C 退出")

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((server_ip, server_port))
print("已连接到服务器。")

while True:
if ser.in_waiting:
data = ser.readline().decode('utf-8').strip()
print(f"接收到数据:{data}")
client.send(data.encode('utf-8')) # 发送数据到服务器
response = client.recv(1024)
print(f"服务器响应:{response.decode('utf-8')}")
ser.write(data.encode('utf-8')) # 发送相同的数据回串口

except serial.SerialException as e:
print(f"串口错误:{e}")
except ConnectionRefusedError:
print("连接被拒绝,请检查服务器地址和端口号是否正确!")
except Exception as e:
print(f"发生错误:{e}")
finally:
if 'ser' in locals():
ser.close()
print("串口已关闭")
client.close()
print("连接已关闭。")

if __name__ == "__main__":
import sys
if len(sys.argv) > 1:
port = sys.argv[1]
else:
port = 'COM3' # 默认串口号

serial_thread = threading.Thread(target=serial_echo, args=(port,))
serial_thread.start()

# 等待线程结束
serial_thread.join()

赞(0)
未经允许不得转载:网硕互联帮助中心 » ESP32连接服务器
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!