From dbfdce8ec90ce7d3e1fe38d0e44b29a4f336b41b Mon Sep 17 00:00:00 2001 From: aixiao Date: Tue, 12 Nov 2024 10:36:32 +0800 Subject: [PATCH] =?UTF-8?q?PICO=20W=20WIFI=20TCP=20=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E5=8F=91=E9=80=81CPU=20=E6=B8=A9=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 6 +- SOFTWARE/Source/MAIN.cpp | 9 ++- SOFTWARE/Source/WIFI.c | 164 ++++++++++++++++++++------------------- SOFTWARE/Source/WIFI.h | 6 +- 4 files changed, 99 insertions(+), 86 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index d8467fc..68cce31 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,6 +3,8 @@ "C_Cpp.errorSquiggles": "disabled", "files.associations": { "cstring": "cpp", - "random": "cpp" - } + "random": "cpp", + "system_error": "c" + }, + "cmake.ignoreCMakeListsMissing": true } \ No newline at end of file diff --git a/SOFTWARE/Source/MAIN.cpp b/SOFTWARE/Source/MAIN.cpp index cc4bf8d..c9f95c4 100644 --- a/SOFTWARE/Source/MAIN.cpp +++ b/SOFTWARE/Source/MAIN.cpp @@ -261,7 +261,6 @@ static void core1_main() #define TARGET_SSID "cpyfb-01" // 替换为你要连接的 SSID #define TARGET_PASSWORD "aa1122334" // 替换为你的 Wi-Fi 密码 - static bool is_target_ssid_found = false; // 标志:目标 SSID 是否被找到 // 扫描结果处理函数 @@ -337,7 +336,13 @@ int main(int argc, char *argv[]) { // 连接成功,执行 TCP 客户端测试 while (1) { - run_tcp_client_test(); + float ONBOARD_TEMPERATURE = read_onboard_temperature(); + printf("Onboard temperature %.02f°C %.02f°F\n", ONBOARD_TEMPERATURE, (ONBOARD_TEMPERATURE * 9 / 5 + 32)); + + char ONBOARD_TEMPERATURE_TEMP[BUFER] = { 0 }; + sprintf(ONBOARD_TEMPERATURE_TEMP, "PICO_W CPU temperature %.02f°C %.02f°F\n", ONBOARD_TEMPERATURE, (ONBOARD_TEMPERATURE * 9 / 5 + 32)); + + run_tcp_client_test(ONBOARD_TEMPERATURE_TEMP); sleep_ms(3000); } diff --git a/SOFTWARE/Source/WIFI.c b/SOFTWARE/Source/WIFI.c index 0a2c67a..02bc4bd 100644 --- a/SOFTWARE/Source/WIFI.c +++ b/SOFTWARE/Source/WIFI.c @@ -1,7 +1,8 @@ #include "WIFI.h" #if 0 -static void dump_bytes(const uint8_t *bptr, uint32_t len) { +static void dump_bytes(const uint8_t *bptr, uint32_t len) +{ unsigned int i = 0; printf("dump_bytes %d", len); @@ -15,34 +16,36 @@ static void dump_bytes(const uint8_t *bptr, uint32_t len) { } printf("\n"); } -#define DUMP_BYTES dump_bytes // 调试用的字节转储函数 + +#define DUMP_BYTES dump_bytes // 调试用的字节转储函数 #else #define DUMP_BYTES(A,B) #endif typedef struct TCP_CLIENT_T_ { - struct tcp_pcb *tcp_pcb; // TCP控制块指针 - ip_addr_t remote_addr; // 远程地址 - uint8_t buffer[BUF_SIZE]; // 接收缓冲区 - int buffer_len; // 缓冲区当前长度 - int sent_len; // 已发送的数据长度 - bool complete; // 是否完成测试 - int run_count; // 运行次数 - bool connected; // 是否已连接 + struct tcp_pcb *tcp_pcb; // TCP控制块指针 + ip_addr_t remote_addr; // 远程地址 + uint8_t buffer[BUF_SIZE]; // 接收缓冲区 + int buffer_len; // 缓冲区当前长度 + int sent_len; // 已发送的数据长度 + bool complete; // 是否完成测试 + int run_count; // 运行次数 + bool connected; // 是否已连接 } TCP_CLIENT_T; -static err_t tcp_client_close(void *arg) { - TCP_CLIENT_T *state = (TCP_CLIENT_T*)arg; +static err_t tcp_client_close(void *arg) +{ + TCP_CLIENT_T *state = (TCP_CLIENT_T *) arg; err_t err = ERR_OK; if (state->tcp_pcb != NULL) { - tcp_arg(state->tcp_pcb, NULL); // 清除回调参数 - tcp_poll(state->tcp_pcb, NULL, 0); // 清除轮询回调 - tcp_sent(state->tcp_pcb, NULL); // 清除发送回调 - tcp_recv(state->tcp_pcb, NULL); // 清除接收回调 - tcp_err(state->tcp_pcb, NULL); // 清除错误回调 - err = tcp_close(state->tcp_pcb); // 关闭TCP连接 + tcp_arg(state->tcp_pcb, NULL); // 清除回调参数 + tcp_poll(state->tcp_pcb, NULL, 0); // 清除轮询回调 + tcp_sent(state->tcp_pcb, NULL); // 清除发送回调 + tcp_recv(state->tcp_pcb, NULL); // 清除接收回调 + tcp_err(state->tcp_pcb, NULL); // 清除错误回调 + err = tcp_close(state->tcp_pcb); // 关闭TCP连接 if (err != ERR_OK) { - DEBUG_printf("close failed %d, calling abort\n", err); // 如果关闭失败,调用abort + DEBUG_printf("close failed %d, calling abort\n", err); // 如果关闭失败,调用abort tcp_abort(state->tcp_pcb); err = ERR_ABRT; } @@ -52,53 +55,52 @@ static err_t tcp_client_close(void *arg) { } // 操作结果回调 -static err_t tcp_result(void *arg, int status) { - TCP_CLIENT_T *state = (TCP_CLIENT_T*)arg; +static err_t tcp_result(void *arg, int status) +{ + TCP_CLIENT_T *state = (TCP_CLIENT_T *) arg; if (status == 0) { - DEBUG_printf("test success\n"); // 测试成功 + DEBUG_printf("test success\n"); // 测试成功 } else { - DEBUG_printf("test failed %d\n", status); // 测试失败 + DEBUG_printf("test failed %d\n", status); // 测试失败 } - state->complete = true; // 标记测试完成 - return tcp_client_close(arg); // 关闭连接 + state->complete = true; // 标记测试完成 + return tcp_client_close(arg); // 关闭连接 } // 轮询回调 -static err_t tcp_client_poll(void *arg, struct tcp_pcb *tpcb) { +static err_t tcp_client_poll(void *arg, struct tcp_pcb *tpcb) +{ DEBUG_printf("tcp_client_poll\n"); - return tcp_result(arg, -1); // 无响应视为错误 + return tcp_result(arg, -1); // 无响应视为错误 } // 错误处理回调 -static void tcp_client_err(void *arg, err_t err) { +static void tcp_client_err(void *arg, err_t err) +{ if (err != ERR_ABRT) { - DEBUG_printf("tcp_client_err %d\n", err); // 打印错误信息 + DEBUG_printf("tcp_client_err %d\n", err); // 打印错误信息 tcp_result(arg, err); } } // 连接建立回调 -static err_t tcp_client_connected(void *arg, struct tcp_pcb *tpcb, err_t err) { - TCP_CLIENT_T *state = (TCP_CLIENT_T*)arg; +static err_t tcp_client_connected(void *arg, struct tcp_pcb *tpcb, err_t err) +{ + TCP_CLIENT_T *state = (TCP_CLIENT_T *) arg; if (err != ERR_OK) { - printf("connect failed %d\n", err); // 连接失败 + printf("connect failed %d\n", err); // 连接失败 return tcp_result(arg, err); } - state->connected = true; // 标记已连接 - DEBUG_printf("连接成功,准备发送消息!!!\n"); // 连接成功,准备发送消息 - - // 定义要发送的字符串 - const char *message = "PICO W\n"; - state->buffer_len = strlen(message); // 设置要发送的字符串长度 - memcpy(state->buffer, message, state->buffer_len); // 将字符串复制到缓冲区 + state->connected = true; // 标记已连接 + DEBUG_printf("连接成功,准备发送消息!!!\n"); // 连接成功,准备发送消息 // 发送字符串到服务器 err = tcp_write(tpcb, state->buffer, state->buffer_len, TCP_WRITE_FLAG_COPY); if (err != ERR_OK) { - DEBUG_printf("发送失败: %d\n", err); // 发送失败 + DEBUG_printf("发送失败: %d\n", err); // 发送失败 return tcp_result(arg, -1); } - DEBUG_printf("发送数据: %s\n", message); // 打印发送的消息 + DEBUG_printf("发送数据: %s\n", state->buffer); // 打印发送的消息 memset(state->buffer, 0, state->buffer_len); state->buffer_len = 0; @@ -106,10 +108,11 @@ static err_t tcp_client_connected(void *arg, struct tcp_pcb *tpcb, err_t err) { return ERR_OK; } -err_t tcp_client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err) { - TCP_CLIENT_T *state = (TCP_CLIENT_T*)arg; +err_t tcp_client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err) +{ + TCP_CLIENT_T *state = (TCP_CLIENT_T *) arg; if (!p) { - DEBUG_printf("接收数据失败,p 为 NULL\n"); // 添加调试信息 + DEBUG_printf("接收数据失败,p 为 NULL\n"); // 添加调试信息 return tcp_result(arg, -1); } // this method is callback from lwIP, so cyw43_arch_lwip_begin is not required, however you @@ -118,13 +121,12 @@ err_t tcp_client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err cyw43_arch_lwip_check(); if (p->tot_len > 0) { DEBUG_printf("recv %d err %d\n", p->tot_len, err); - for (struct pbuf *q = p; q != NULL; q = q->next) { + for (struct pbuf * q = p; q != NULL; q = q->next) { DUMP_BYTES(q->payload, q->len); } // Receive the buffer const uint16_t buffer_left = BUF_SIZE - state->buffer_len; - state->buffer_len += pbuf_copy_partial(p, state->buffer + state->buffer_len, - p->tot_len > buffer_left ? buffer_left : p->tot_len, 0); + state->buffer_len += pbuf_copy_partial(p, state->buffer + state->buffer_len, p->tot_len > buffer_left ? buffer_left : p->tot_len, 0); tcp_recved(tpcb, p->tot_len); } @@ -140,15 +142,16 @@ err_t tcp_client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err } // 发送数据回调 -static err_t tcp_client_sent(void *arg, struct tcp_pcb *tpcb, u16_t len) { - TCP_CLIENT_T *state = (TCP_CLIENT_T*)arg; - DEBUG_printf("tcp_client_sent %u\n", len); // 打印发送的数据长度 - state->sent_len += len; // 更新已发送的数据长度 +static err_t tcp_client_sent(void *arg, struct tcp_pcb *tpcb, u16_t len) +{ + TCP_CLIENT_T *state = (TCP_CLIENT_T *) arg; + DEBUG_printf("tcp_client_sent %u\n", len); // 打印发送的数据长度 + state->sent_len += len; // 更新已发送的数据长度 if (state->sent_len >= BUF_SIZE) { - state->run_count++; // 增加运行次数 + state->run_count++; // 增加运行次数 if (state->run_count >= TEST_ITERATIONS) { - tcp_result(arg, 0); // 达到迭代次数,测试成功 + tcp_result(arg, 0); // 达到迭代次数,测试成功 return ERR_OK; } @@ -162,40 +165,41 @@ static err_t tcp_client_sent(void *arg, struct tcp_pcb *tpcb, u16_t len) { } // 打开TCP连接 -static bool tcp_client_open(void *arg) { - TCP_CLIENT_T *state = (TCP_CLIENT_T*)arg; +static bool tcp_client_open(void *arg) +{ + TCP_CLIENT_T *state = (TCP_CLIENT_T *) arg; DEBUG_printf("Connecting to %s port %u\n", ip4addr_ntoa(&state->remote_addr), TCP_PORT); - state->tcp_pcb = tcp_new_ip_type(IP_GET_TYPE(&state->remote_addr)); // 创建TCP控制块 + state->tcp_pcb = tcp_new_ip_type(IP_GET_TYPE(&state->remote_addr)); // 创建TCP控制块 if (!state->tcp_pcb) { - DEBUG_printf("failed to create pcb\n"); // 创建失败 + DEBUG_printf("failed to create pcb\n"); // 创建失败 return false; } - tcp_arg(state->tcp_pcb, state); // 设置回调参数 - tcp_poll(state->tcp_pcb, tcp_client_poll, POLL_TIME_S * 2); // 设置轮询回调 - tcp_sent(state->tcp_pcb, tcp_client_sent); // 设置发送回调 - tcp_recv(state->tcp_pcb, tcp_client_recv); // 设置接收回调 - tcp_err(state->tcp_pcb, tcp_client_err); // 设置错误回调 + tcp_arg(state->tcp_pcb, state); // 设置回调参数 + tcp_poll(state->tcp_pcb, tcp_client_poll, POLL_TIME_S * 2); // 设置轮询回调 + tcp_sent(state->tcp_pcb, tcp_client_sent); // 设置发送回调 + tcp_recv(state->tcp_pcb, tcp_client_recv); // 设置接收回调 + tcp_err(state->tcp_pcb, tcp_client_err); // 设置错误回调 - state->buffer_len = 0; // 初始化缓冲区长度 + //state->buffer_len = 0; // 初始化缓冲区长度 // 使用cyw43_arch_lwip_begin/end确保正确锁定 cyw43_arch_lwip_begin(); - err_t err = tcp_connect(state->tcp_pcb, &state->remote_addr, TCP_PORT, tcp_client_connected); // 尝试连接 + err_t err = tcp_connect(state->tcp_pcb, &state->remote_addr, TCP_PORT, tcp_client_connected); // 尝试连接 cyw43_arch_lwip_end(); return err == ERR_OK; } // 初始化TCP客户端 -static TCP_CLIENT_T* tcp_client_init(void) { - TCP_CLIENT_T *state = calloc(1, sizeof(TCP_CLIENT_T)); // 分配内存 +static TCP_CLIENT_T *tcp_client_init(void) +{ + TCP_CLIENT_T *state = calloc(1, sizeof(TCP_CLIENT_T)); // 分配内存 if (!state) { - DEBUG_printf("failed to allocate state\n"); // 分配失败 + DEBUG_printf("failed to allocate state\n"); // 分配失败 return NULL; } - // 如果 TEST_TCP_SERVER_IP 是 IP 地址,直接解析为 IP 地址 if (ip4addr_aton(TEST_TCP_SERVER_IP, &state->remote_addr) == 0) { // 如果解析失败,尝试作为域名解析 @@ -213,31 +217,35 @@ static TCP_CLIENT_T* tcp_client_init(void) { } // 运行TCP客户端测试 -void run_tcp_client_test(void) { - TCP_CLIENT_T *state = tcp_client_init(); // 初始化客户端 +void run_tcp_client_test(char *s) +{ + TCP_CLIENT_T *state = tcp_client_init(); // 初始化客户端 if (!state) { return; } - if (!tcp_client_open(state)) { // 打开连接 + if (!tcp_client_open(state)) { // 打开连接 tcp_result(state, -1); // 连接失败 return; } - while(!state->complete) { // 循环等待测试完成 + + strcpy(state->buffer, s); + state->buffer_len = strlen(state->buffer); + + while (!state->complete) { // 循环等待测试完成 #if PICO_CYW43_ARCH_POLL // 如果使用pico_cyw43_arch_poll,需要定期调用cyw43_arch_poll cyw43_arch_poll(); // 可以选择休眠直到有工作需要做 cyw43_arch_wait_for_work_until(make_timeout_time_ms(1000)); #else - cyw43_arch_poll(); + //cyw43_arch_poll(); // 可以选择休眠直到有工作需要做 - cyw43_arch_wait_for_work_until(make_timeout_time_ms(1000)); - - + //cyw43_arch_wait_for_work_until(make_timeout_time_ms(1000)); + // 如果不使用pico_cyw43_arch_poll,可以通过中断在后台处理 //sleep_ms(1000); // 示例中的阻塞操作 #endif } - free(state); // 释放内存 -} \ No newline at end of file + free(state); // 释放内存 +} diff --git a/SOFTWARE/Source/WIFI.h b/SOFTWARE/Source/WIFI.h index f64df4f..724daed 100644 --- a/SOFTWARE/Source/WIFI.h +++ b/SOFTWARE/Source/WIFI.h @@ -15,13 +15,11 @@ #define TEST_TCP_SERVER_IP "192.168.31.17" #define TCP_PORT 91 -#define DEBUG_printf printf #define BUF_SIZE 2048 - #define TEST_ITERATIONS 10 #define POLL_TIME_S 5 +#define DEBUG_printf printf - -extern void run_tcp_client_test(void); +void run_tcp_client_test(char *s); #endif