单片机IWIP Onenet http实验
单片机 STM32F407开发板DMF407电机开发板平台keil V5.31HSE 为8MHZHSI为16MHZ主函数int main(void) { HAL_Init(); /* 初始化HAL库 */ sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */ delay_init(168); /* 延时初始化 */ usart_init(115200); /* 串口初始化为115200 */ usmart_dev.init(84); /* 初始化USMART */ led_init(); /* 初始化LED */ lcd_init(); /* 初始化LCD */ key_init(); /* 初始化按键 */ my_mem_init(SRAMIN); /* 初始化内部SRAM内存池 */ my_mem_init(SRAMCCM); /* 初始化内部SRAMCCM内存池 */ freertos_demo(); /* 创建lwIP的任务函数 */ }void freertos_demo(void) { /* start_task任务 */ xTaskCreate((TaskFunction_t )start_task, (const char * )start_task, (uint16_t )START_STK_SIZE, (void * )NULL, (UBaseType_t )START_TASK_PRIO, (TaskHandle_t * )StartTask_Handler); vTaskStartScheduler(); /* 开启任务调度 */ }void start_task(void *pvParameters) { pvParameters pvParameters; g_lwipdev.lwip_display_fn lwip_test_ui; lwip_test_ui(1); /* 加载后前部分UI */ while (lwip_comm_init() ! 0) { lcd_show_string(30, 110, 200, 16, 16, lwIP Init failed!!, RED); delay_ms(500); lcd_fill(30, 50, 200 30, 50 16, WHITE); lcd_show_string(30, 110, 200, 16, 16, Retrying... , RED); delay_ms(500); LED1_TOGGLE(); } while (!ethernet_read_phy(PHY_SR)) /* 检查MCU与PHY芯片是否通信成功 */ { printf(MCU与PHY芯片通信失败请检查电路或者源码\r\n); } while ((g_lwipdev.dhcpstatus ! 2)(g_lwipdev.dhcpstatus ! 0XFF)) /* 等待DHCP获取成功/超时溢出 */ vTaskDelay(5); taskENTER_CRITICAL(); /* 进入临界区 */ /* 创建lwIP任务 */ xTaskCreate((TaskFunction_t )lwip_demo_task, (const char* )lwip_demo_task, (uint16_t )LWIP_DMEO_STK_SIZE, (void* )NULL, (UBaseType_t )LWIP_DMEO_TASK_PRIO, (TaskHandle_t* )LWIP_Task_Handler); /* LED测试任务 */ xTaskCreate((TaskFunction_t )led_task, (const char* )led_task, (uint16_t )LED_STK_SIZE, (void* )NULL, (UBaseType_t )LED_TASK_PRIO, (TaskHandle_t* )LEDTask_Handler); vTaskDelete(StartTask_Handler); /* 删除开始任务 */ taskEXIT_CRITICAL(); /* 退出临界区 */ }void lwip_demo_task(void *pvParameters) { pvParameters pvParameters; lwip_demo(); while (1) { vTaskDelay(5); } }void lwip_demo(void) { uint32_t data_len 0; struct pbuf *q; err_t err; ip4_addr_t server_ipaddr, loca_ipaddr; static uint16_t server_port, loca_port; server_port TCP_DEMO_PORT; netconn_gethostbyname(DEST_MANE,server_ipaddr); while (1) { atk_start: g_tcp_clientconn netconn_new(NETCONN_TCP); /* 创建一个TCP链接 */ err netconn_connect(g_tcp_clientconn, server_ipaddr, server_port); /* 连接服务器 */ if (err ! ERR_OK) { printf(接连失败\r\n); netconn_delete(g_tcp_clientconn); /* 返回值不等于ERR_OK,删除g_tcp_clientconn连接 */ } else if (err ERR_OK) /* 处理新连接的数据 */ { struct netbuf *recvbuf; g_tcp_clientconn-recv_timeout 10; netconn_getaddr(g_tcp_clientconn, loca_ipaddr, loca_port, 1); /* 获取本地IP主机IP地址和端口号 */ lcd_show_string(5, 170, 200, 16, 16, link succeed, BLUE); while (1) { g_temp_rh[0] 30 rand() % 10 1; /* 温度的数据 */ g_temp_rh[1] 54.8 rand() % 10 1; /* 湿度的数据 */ g_tempStr[0] g_temp_rh[0] / 10 0x30; /* 上传温度 */ g_tempStr[1] g_temp_rh[0] % 10 0x30;; g_humiStr[0] g_temp_rh[1] / 10 0x30; /* 上传湿度 */ g_humiStr[1] g_temp_rh[1] % 10 0x30; g_len lwip_onehttp_postpkt(g_buffer, apikey, onenet_id, temperature, g_tempStr); netconn_write(g_tcp_clientconn, g_buffer, g_len, NETCONN_COPY); /* 发送tcp_server_sentbuf中的数据 */ g_len lwip_onehttp_postpkt(g_buffer, apikey, onenet_id, humidity, g_humiStr); netconn_write(g_tcp_clientconn, g_buffer, g_len, NETCONN_COPY); /* 发送tcp_server_sentbuf中的数据 */ vTaskDelay(1000); if (netconn_recv(g_tcp_clientconn, recvbuf) ERR_OK) /* 接收到数据*/ { taskENTER_CRITICAL(); /* 进入临界区*/ memset(g_tcp_client_recvbuf, 0, TCP_CLIENT_RX_BUFSIZE); /* 数据接收缓冲区清零*/ for (q recvbuf-p; q ! NULL; q q-next) /*遍历完整个pbuf链表*/ { /*判断要拷贝到TCP_CLIENT_RX_BUFSIZE中的数据是否大于TCP_CLIENT_RX_BUFSIZE的剩余空间如果大于*/ /*的话就只拷贝TCP_CLIENT_RX_BUFSIZE中剩余长度的数据否则的话就拷贝所有的数据 */ if (q-len (TCP_CLIENT_RX_BUFSIZE - data_len)) { memcpy(g_tcp_client_recvbuf data_len, q-payload, (TCP_CLIENT_RX_BUFSIZE - data_len)); /* 拷贝数据 */ } else { memcpy(g_tcp_client_recvbuf data_len, q-payload, q-len); } data_len q-len; if (data_len TCP_CLIENT_RX_BUFSIZE) { break; /* 超出TCP客户端接收数组,跳出 */ } } taskEXIT_CRITICAL(); /* 退出临界区 */ data_len 0; /* 复制完成后data_len要清零 */ printf(%s\r\n, g_tcp_client_recvbuf); netbuf_delete(recvbuf); } else /*关闭连接 */ { netconn_close(g_tcp_clientconn); netconn_delete(g_tcp_clientconn); goto atk_start; } } } } }实验结果

相关新闻

STM32F745ZG与25CSM04 EEPROM的高效数据存储方案

STM32F745ZG与25CSM04 EEPROM的高效数据存储方案

1. 项目背景与核心需求 在嵌入式系统开发中,非易失性存储器的选择往往决定了数据管理的效率和可靠性。25CSM04作为一款4Mb容量的SPI接口EEPROM,其独特的安全特性和灵活的写保护机制,使其成为需要精确数据检索场景的理想选择。STM32F745ZG则是…

2026/7/3 14:15:45阅读更多 →
STM32高精度定时器与CS2200-CP时钟模块集成指南

STM32高精度定时器与CS2200-CP时钟模块集成指南

1. 精确计时在嵌入式系统中的核心价值精确计时是现代嵌入式系统设计中最为基础却又至关重要的功能模块。从工业自动化中的电机控制时序,到物联网设备的数据采集同步,再到消费电子产品的用户交互响应,精确的时间基准贯穿了整个嵌入式应用的方方…

2026/7/3 14:15:45阅读更多 →
混元图像3.0 vs Nano Banana:文生图模型的抽象智能与具象能力实战对比

混元图像3.0 vs Nano Banana:文生图模型的抽象智能与具象能力实战对比

1. 这不是又一个“跑分榜”,而是一场工业级文生图能力的实操压力测试最近刷到不少朋友转发那张LM Arena榜单截图——腾讯混元图像3.0真正在Text-to-Image赛道登顶了。但说实话,我第一次看到时没急着点开链接,而是先关掉页面,泡了杯…

2026/7/3 14:10:45阅读更多 →
QQ机器人脚本开发指南:从入门到实践

QQ机器人脚本开发指南:从入门到实践

1. QQ机器人脚本开发概述在当今自动化办公和社群管理的需求下,QQ机器人已经成为许多社群运营者和开发者的得力助手。通过编写脚本与QQ机器人通讯,我们可以实现自动回复、消息转发、数据统计等一系列实用功能,大幅提升社群管理效率。QQ机器人脚…

2026/7/3 16:11:06阅读更多 →
数据从 Oracle 迁移到 GBase 8a 后,分页查询的不同实现方式总结(附:分片、分区、分桶的区别)

数据从 Oracle 迁移到 GBase 8a 后,分页查询的不同实现方式总结(附:分片、分区、分桶的区别)

本文对比了Oracle与GBase8a数据库的分页查询实现方式差异,为金融行业信创迁移提供技术参考。Oracle传统采用ROWNUM三层嵌套写法(12c以下)或OFFSET-FETCH语法(12c),而GBase8a使用标准LIMIT-OFFSET方式。迁移…

2026/7/3 16:11:06阅读更多 →
工业4-20mA电流环原理与XTR116芯片应用设计

工业4-20mA电流环原理与XTR116芯片应用设计

1. 工业4-20mA电流环的基础原理与设计需求在工业自动化领域,4-20mA电流环传输标准已经沿用了半个多世纪。这种看似简单的信号传输方式背后,蕴含着对抗工业环境干扰的智慧。电流信号相比电压信号的最大优势在于传输距离——理论上可达数公里而不衰减&…

2026/7/3 16:11:06阅读更多 →
工业4-20mA电流环设计与STM32F746ZG应用实践

工业4-20mA电流环设计与STM32F746ZG应用实践

1. 4-20mA电流环的工业应用背景在工业自动化领域,4-20mA电流环传输技术已经持续服役超过半个世纪。这种看似简单的模拟信号传输方式,却因其独特的鲁棒性成为过程控制系统的首选方案。与电压信号相比,电流信号具有显著优势:在长距离…

2026/7/3 16:11:06阅读更多 →
AD74413R与STM32F071VB的高精度混合信号处理方案

AD74413R与STM32F071VB的高精度混合信号处理方案

1. 项目背景与硬件选型考量在工业测量与控制系统中,同时实现高精度模拟信号采集(ADC)和输出(DAC)是常见需求。AD74413R作为ADI公司推出的软件可配置输入/输出器件,配合STM32F071VB这类经济型MCU&#xff0c…

2026/7/3 16:11:06阅读更多 →
纪元1800模组加载器:用XML魔法打造你的个性化游戏世界

纪元1800模组加载器:用XML魔法打造你的个性化游戏世界

纪元1800模组加载器:用XML魔法打造你的个性化游戏世界 【免费下载链接】anno1800-mod-loader The one and only mod loader for Anno 1800, supports loading of unpacked RDA files, XML merging and Python mods. 项目地址: https://gitcode.com/gh_mirrors/an/…

2026/7/3 16:06:05阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/7/3 14:18:39阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/7/3 14:38:35阅读更多 →
LV3296与PIC18F45K22的UART通信与USB扩展方案

LV3296与PIC18F45K22的UART通信与USB扩展方案

1. LV3296与PIC18F45K22的硬件搭档解析在嵌入式数据采集系统中,LV3296条形码扫描模块与PIC18F45K22微控制器的组合堪称经典搭配。LV3296作为一款工业级条码扫描头,其核心是一颗高性能CMOS图像传感器,配合专用解码芯片,能自动识别包…

2026/7/3 0:03:41阅读更多 →
AI初创生存指南:6个月完成可信度验证闭环

AI初创生存指南:6个月完成可信度验证闭环

1. 这不是“逆袭指南”,而是一份AI初创公司真实生存手记“How To Beat Odds As an AI Startup?”——这个标题乍看像一句热血口号,但在我带过7个从0到1的AI产品团队、亲手踩过融资失败、技术债崩盘、客户POC卡在最后一公里等23类典型坑之后,…

2026/7/3 0:03:41阅读更多 →
多模态+推理链+RAG 2.0+智能体:工业级AI系统落地四支柱

多模态+推理链+RAG 2.0+智能体:工业级AI系统落地四支柱

1. 这不是又一篇“AI趋势速览”,而是一份实操者手记:当多模态、推理链、检索增强与智能体协作真正撞进工程现场“LAI #73”这个编号本身就像一个暗号——它不属于某家大厂的白皮书,也不是学术会议的议程表,而是长期泡在模型训练集…

2026/7/3 0:03:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/3 1:12:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/3 1:36:36阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/3 2:08:15阅读更多 →