这个东西做了两天,第一天改底层接口,编译通过。

第二天调通整个程序。

这里难点在于对LwIP不熟悉,在STM32上开发,居然也没有ULINK,连烧程序都是要用串口的。

如果有朋友有需要,我可以给出几个比较关键的东西,不过也说明一下我的开发环境,我是基于神州4号开发板,用keil开发的。

1. UDP客户端/服务器端代码。

main函数:

int main(void)
{
struct udp_pcb *Udppcb_svr = NULL;struct ip_addr dAddr;struct pbuf *p = NULL;int ret = 0;System_Setup();/* Initilaize the LwIP satck */LwIP_Init();p = pbuf_alloc(PBUF_TRANSPORT, sizeof(UDPArr), PBUF_RAM);
if (p == NULL){printf("no memory for p \r\n");}p->payload = (void *)(UDPArr); // 全局变量,只是一个hello字符串。while (1){    /* Periodic tasks */System_Periodic_Handle();//ARMJISHU_TouchScreen();if (init_artnet_flag < TEST_INTERVAL){init_artnet_flag++;if (get_brdcast_addr() != 0){Delay_ARMJISHU(4000);if (init_artnet_flag == 0x4000){printf("brdcast addr: %x \r\n", get_brdcast_addr());Udppcb_svr = udp_new();if (NULL == Udppcb_svr){printf("no memory for Udppcb_svr\r\n");}ret = udp_bind(Udppcb_svr, IP_ADDR_ANY, 161);if (ret != ERR_OK){printf("bind error : %d\r\n", ret);}//IP4_ADDR(&dAddr , 192,168,1,107);dAddr.addr = get_brdcast_addr();ret = udp_connect(Udppcb_svr, &dAddr, 61234);if (ret != ERR_OK){printf("connect error : %d\r\n", ret);}                  printf("ready send \r\n");udp_send(Udppcb_svr, p);printf("send ok \r\n");udp_disconnect(Udppcb_svr);pbuf_free(p);ret = udp_bind(Udppcb_svr, IP_ADDR_ANY, 161);if (ret != ERR_OK){printf("bind error : %d\r\n", ret);}//Udppcb_svr->so_options |= SOF_BROADCAST;udp_recv(Udppcb_svr, UDP_Receive, NULL);init_artnet_flag = ARTNET_INIT_OK;} }else{init_artnet_flag = 0;}}}
}

我这段代码的逻辑大概是开机初始化,然后等待DHCP分配到IP给板子,之后再去尝试连接到指定的UDP服务器,广播也可以,指定地址也可以,发送一个包,之后就断开连接,做成服务器的形式。

对上述代码有几个关键点想说明的,pbuf_alloc如果用我提供的PBUF_TRANSPORT类型去申请的话,一定要知道,开辟空间时,要预留IP层和UDP/TCP层的头部大小,并且用户数据要跳过这个头部再开始使用。否则很容易造成在调用socket的发送函数之后,整个程序死掉。

UDP_Receive函数:

void UDP_Receive(void *arg, struct udp_pcb *upcb, struct pbuf *p,struct ip_addr *addr, u16_t port)
{struct ip_addr dAddr = *addr;if (p != NULL){printf("addr: %x, port: %d\r\n", dAddr.addr, port);printf("total len: %d, len: %d\r\n", p->tot_len, p->len);//, (char *)(p->payload));// echo for debugdAddr.addr = get_brdcast_addr();udp_sendto(upcb, p, &dAddr, port);pbuf_free(p);}
}

这是做成一个简单的回显。

2. Artnet中我改过的代码。

就不在这里贴了,但是可以提供一个链接下载。

stm32上基于LwIP移植LibArtnet相关推荐

  1. ARM硬件平台上基于UCOS移植Lwip网络协议栈

    目录 1.硬件平台 1.1硬件平台简介 为保证网络协议栈的顺利移植,选用了LPC2220作为主控芯片,RTL8019AS作为网卡芯片,使用HR901170A进行电平转换.滤波. LPC2220是Phi ...

  2. 【程序】在STM32单片机上用1700行代码实现基于LwIP 2.1.2协议栈raw API和FatFs文件系统的FTP服务器(20200703版)

    此程序是旧版本,请下载最新的20230315版使用. lwipopts.h里面的MEM_SIZE这个选项非常重要!一定要尽可能大(至少10240以上,最好是102400以上),这样lwip才有足够的内 ...

  3. 【程序】在STM32单片机上用1700行代码实现基于LwIP 2.1.2协议栈raw API和FatFs文件系统的FTP服务器(20230315版)

    [更新记录] 本程序基于20200703版的程序,作出了如下更新: 1. 解决了当accept函数的参数err!=ERR_OK时,程序出现HardFault错误的bug. 2. 当lwip MEM_S ...

  4. stm32移植paho_如何在STM32上移植Linux?超详细的实操经验分享

    原标题:如何在STM32上移植Linux?超详细的实操经验分享 刚从硬件跳槽为嵌软时,没有任何一丝的准备.一入职,领导就交代了一项特难的任务--在stm32上移植linux! 瞬间我就懵了,没办法硬着 ...

  5. ucos移植到stm32上的中断小小改进

    uCosII移植到stm32上的文章和demo已经很多了,细节上建议大家可以看官方的移植文档( 当然是E文的).网上流传的各种移植版本基本都是基于官方的移植版本做了小改进.这些改进基本都限制在更适合自 ...

  6. 构建一个轻量级的嵌入式虚拟平台,开发工程用板stm32 picoc解释器,大量自定义函数,sarm拓展,lwip移植,nes模拟器移植,系统优化,等等技术的融合

    让嵌入式想java一样一处编写到处运行 第一次写博客,其实接触嵌入式已经快两年了,从开始学51单片机的时候,怀着满腔的热情.写出了点亮第一个流水灯代码的时候那个无比的激动,到后面自己做许多有趣的东西( ...

  7. stm32 移植java_把Lua移植到stm32上,效果不错! (amoBBS 阿莫电子论坛)

    因为我们产品的需要满足不同行业需求,所以一直在寻找一个脚本语言,以便灵活配置. 前段时间还自己花时间去实现一个C语言解释器,看了一堆编译原理的东西,以及虚拟机等,头都搞大了,把基本功能实现了,但总是不 ...

  8. STM32上移植ds1307笔记

    PS:网上关于ds1307的资料最多还是基于51等单片机的,和stm32上还是略有差别,代码是参考了http://www.openedv.com/posts/list/20167.htm 但是他的代码 ...

  9. mavlink协议详解_MAVLink通讯协议在STM32上移植,并自定义协议

    mavlink全称是(Micro Air Vehicle Message Marshalling Library),从名字可以看出,mavlink是主要面向飞控的一种开源通信协议.因此它默认定义了很多 ...

  10. LVGL在STM32上的移植及触摸驱动移植(触摸屏控制版)

    前言   在日常的开发中,涉及到用户显示界面控制的时候,如何快速.优美的设计一款用户UI,是攻城狮应该具备的能力(择偶优先权),如何把嵌入式UI设计像高级语言图形化设计一样简便.快捷,今天重磅介绍一款 ...

最新文章

  1. Ubuntu 12.10下配置Web服务器详细教程
  2. string类有可以调换方向的函数吗_C++中的string类的用法小结
  3. python基础应用_【复习】mysql+python基础应用(20190815)
  4. C++中比较两个浮点数是否相等
  5. python中restful接口开发实例_Python RESTful接口开发02
  6. ajax动态获取url参数值,获取URL参数的方法
  7. 从零开始编写深度学习库(五)PoolingLayer 网络层CPU编写
  8. 蜡烛图plotly_Python数据分析:基于Plotly的动态可视化绘图简介,目录书摘
  9. Element UI 重置表单功能
  10. VC2013 配置属性
  11. 地理探测器的学习与研究初探
  12. Smobiler 仿得到APP个人主页
  13. python实现计算标准偏差函数
  14. 什么是十六进制法_十六进制计算方法是什么?
  15. 有关于APICLOUD打印条码功能的操作
  16. matlab中欠定方程组超定方程组_生辰八字中天干与地支是什么
  17. 你听说过史莱姆吗??【oj】
  18. 20款Adobe AIR小游戏
  19. css实现文字中间横线,css实现文字居中两边横线效果的示例代码
  20. 基于Amazon KVS 与 Amazon Rekognition Streaming Video Events实时视频检测方案

热门文章

  1. STK对卫星轨道摄动的处理
  2. 【python】80行代码实现压缩包密码破解软件,支持zip和rar
  3. Opencv 下载驿站
  4. lodop php 快递单_Lodop打印模板 - 让Web打印易起来~~ – 基于ThinkPHP和Bootstrap的极速后台开发框架...
  5. PcShare2005代码阅读(2)
  6. 活灵活现用Git-技巧篇
  7. java 自己实现工作流_Java基于jeeplus vue实现简单工作流过程图解
  8. Flash游戏开发技术分析(下)
  9. 计算机系统基础第二版_2020年注册环保工程师公共基础考试题库
  10. 电气能插本计算机类吗,2019年专插本电气工程及自动化专业介绍