ESP32的具体功能是:
1:设置串口号,波特率等。
2:开启wifi,让地面站的电脑链接该WIFI
3:监听一个端口,我这里直接开启5566端口。
4:当串口收到数据之后,将数据原封不动发送给5566端口中的客户
5:当端口接收到数据之后,将数据原样发送出串口。
首先,测试了普通数据能能否正常转发。
我查看了数据有没有丢包。结果是没有丢数据
但是在使用上位机链接的时候,就无法连接成功。(当然我拥有其他的8266。或者4G数传是可以通过这种方式链接的)
作为普通数传肯定是没问题的,可能是MS地面站对数据包的分包方式有要求。
好了直接上代码吧
import machine
import time
import network
import socket
import _thread
from machine import Pin
ulen = 0
wlen = 0
pin2 = machine.Pin(2,machine.Pin.OUT)
# 选择串口号和波特率
uart = machine.UART(2, 38400)
# 设置热点名称和密码
SSID = "ESP32AP"
PASSWORD = "password"
# 连接WiFi网络
wifi = network.WLAN(network.AP_IF)
wifi.active(True)
wifi.config(essid=SSID)
# 打印IP地址
print("WiFi热点已启动,IP地址为:", wifi.ifconfig()[0])
# 创建套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定IP地址和端口号
ESP_IP = wifi.ifconfig()[0]
ESP_PORT = 5566
sock.bind((ESP_IP, ESP_PORT))
# 开始监听
sock.listen(1)
print("正在监听连接...")
# 全局变量用于存储当前连接的客户端
client_conn = None
client_addr = None
# 客户端处理函数
def handle_client(conn, addr):
global client_conn, client_addr
global ulen
global wlen
client_conn = conn
client_addr = addr
print("已连接:", client_addr)
# 循环接收数据
while True:
try:
data = conn.recv(4096)
if not data:
break
print("收到数据:", data.decode())
# 写入数据
uart.write(bytes(data))
except:
print("退出:", client_addr)
break
# 关闭连接
conn.close()
# 等待新连接函数
def wait_for_client():
global client_conn, client_addr
while True:
# 等待连接
conn, addr = sock.accept()
print("已连接:", addr)
# 关闭上一个客户端连接
if client_conn is not None:
print("关闭上一个连接:", client_addr)
client_conn.close()
client_conn = None
client_addr = None
# 创建新线程处理客户端请求
_thread.start_new_thread(handle_client, (conn, addr))
def uart_irq():
global client_conn, client_addr
global ulen
global wlen
while True:
# 从串口读取数据
data = uart.read()
if data:
# 发送数据给客户端
print("有串口数据")
wlen = wlen + 1
print(wlen)
try:
#print("串口收到数据!")
#print(len(data))
#print(*data)
ulen = ulen + len(data)
#uart.write(bytes(data))
print(ulen)
print("-------------------")
client_conn.send(bytes(data))
#print(data)
except:
pass
#time.sleep(0.01)
# 创建新线程等待新连接
_thread.start_new_thread(wait_for_client, ())
# 创建新线程等待串口数据
_thread.start_new_thread(uart_irq, ())
# 主程序代码
while True:
#print("主程序正在运行...")
pin2.value(1)
time.sleep(0.1)
pin2.value(0)
time.sleep(3)