当前位置: 首页 > news >正文

单片机IWIP Onenet http实验

单片机 :STM32F407
开发板:DMF407电机开发板
平台:keil V5.31

HSE 为8MHZ
HSI为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; } } } } }

实验结果:

http://www.jsqmd.com/news/1115837/

相关文章:

  • 抖音无水印视频下载终极指南:免费工具快速获取高清素材
  • Selenium自动化测试环境搭建:Chrome与驱动整合包制作与使用指南
  • 终极Steam挂卡指南:Idle Master完整使用教程,轻松收集所有交易卡片
  • 浙江的数学还是太卷了
  • 一文读懂oeAware-manager的12种调优插件:功能、场景与使用技巧
  • 嵌入式键盘管理系统:硬件去抖动与中断驱动设计
  • 为什么选择Kiran-authentication-devices?欧拉系统认证设备兼容层的5大优势
  • 3分钟免费激活IDM完整版:永久解锁极速下载的终极指南
  • MC74HC165A与PIC18LF27K40实现高效数字输入扩展方案
  • 单片机IWIP MQTT实验
  • Kiran-Screensaver性能优化指南:减少系统资源占用的5个实用技巧
  • 视频AI放大神器Video2X:5分钟将模糊视频无损升级4K画质
  • 基于Si4731与PIC18F86K22的嵌入式音频开发平台设计
  • Windows系统卡顿如蜗牛?用Winhance中文版实现性能提升的3个关键步骤
  • ChanlunX:通达信缠论分析插件的完整指南
  • 合同审查效率提升300%,ChatGPT法律写作必须绕开的7个伦理雷区,资深法官/律所合伙人联合警示
  • 如何将图纸、BOM、订单质量数据整合到知识库
  • MAX9744 Class D放大器与PIC18F87K22的音频系统设计
  • LTC6903与PIC18F26K80构建高精度数字控制振荡器系统
  • 深入解析CSRF攻击原理与防御策略:从浏览器机制到实战防护
  • STM32L4A6RG与25CSM04 EEPROM的高速SPI数据检索实现
  • LTC6904可编程振荡器在嵌入式系统中的应用与优化
  • openEuler升级不求人:openeuler-upgrader工具核心功能详解与实战案例
  • Kiran-authentication-devices源码探秘:UKey设备绑定与认证流程的实现原理
  • 外贸SEO中如何用Schema标记让Google直接把你的产品展示给大买家
  • 适合学生的行李箱尺寸推荐|2026专业实测选购指南
  • 2026年,细胞技术如何服务健康管理?聚焦干细胞领域发展观察
  • 边缘计算中A5000与PIC18LF2620的硬件安全协同设计
  • 嵌入式按键管理:74HC32与MK64FX512VDC12硬件优化方案
  • MIC1557与PIC24FJ256GB210构建高精度定时系统