- 流程图
- 例程
- 接收
-
//UDP回调函数 void udp_demo_recv(void *arg,struct udp_pcb *upcb,struct pbuf *p,struct ip_addr *addr,u16_t port) { struct pbuf *q; u32 i; if(p!=NULL) //接收到不为空的数据时 { memset(udp_demo_recvbuf,0,UDP_DEMO_RX_BUFSIZE); //数据接收缓冲区清零 for(q=p;q!=NULL;q=q->next) //遍历完整个pbuf链表 { memcpy(udp_demo_recvbuf,q->payload,q->len); } udp_demo_flag|=1<<6; //标记接收到数据了 pbuf_free(p);//释放内存 } else { udp_disconnect(upcb); udp_demo_flag &= ~(1<<5); //标记连接断开 } }
-
- 发送
/********************************************************* * 函数名:void udp_ArtNet_SendARTPollReplay(struct udp_pcb *upcb, uint8_t SwoutBuffer[4], uint8_t BindNum) * 描述 :回传设备节点信息 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **********************************************************/ void udp_ArtNet_SendARTPollReplay(struct udp_pcb *upcb, uint8_t SwoutBuffer[4], uint8_t BindNum) { struct pbuf *ptr; uint8_t id[8]; uint8_t ipadd[4]; uint8_t shortname[ShortNameLength]; uint8_t longname[LongNameLength]; uint8_t swin[4] = {0x01, 0x02, 0x03, 0x04}; uint8_t swout[4] = {0}; uint8_t i; for(i = 0; i < 4; i++ ) swout[i] = SwoutBuffer[i]; sprintf((char *)id,"Art-Net"); memcpy(ArtPollReply.ID, id, sizeof(ArtPollReply.ID)); //写入ID //OpCode ArtPollReply.OpCode = OpPollReply; //写入地址 ipadd[0] = lwipdev.ip[0]; ipadd[1] = lwipdev.ip[1]; ipadd[2] = lwipdev.ip[2]; ipadd[3] = lwipdev.ip[3]; memcpy(ArtPollReply.IP, ipadd, sizeof(ArtPollReply.IP)); //端口号 ArtPollReply.Port = DefaultPort; //6454 //软件版本号 ArtPollReply.VersionInfoHi = 1; ArtPollReply.VersionInfoLo = 0; //网络开关 ArtPollReply.NetSwitch = 0; ArtPollReply.SubSwitch = 0; //厂家OEM ArtPollReply.OemHi = 0x55; ArtPollReply.OemLo = 0xaa; //BIOS扩展区 ArtPollReply.UbeaVersion = 0; //状态寄存器 ArtPollReply.Status = 0xd2; //ESTA制造商代码 ArtPollReply.EstaManHi = 0; ArtPollReply.EstaManLo = 0; //空终止短名称,固定为18个字符 sprintf((char *)shortname, "Art-Net"); memcpy(ArtPollReply.ShortName,shortname,sizeof(shortname)); //空终止长名称,固定为64个字符 sprintf((char *)longname, "Art-Net SPT 200522 Dream Catcher"); memcpy(ArtPollReply.LongName,longname,sizeof(longname)); //节点运行状态或者操作错误的文字报告 sprintf((char *)ArtPollReply.NodeReport, "%d DMX output universes active!", 4); //端口输入输出数量,高字节扩展用,目前为零 ArtPollReply.NumPortsHi = 0; //低字节端口输入输出数量,0-4,使用PortTypes时,忽略此字段 ArtPollReply.NumPortsLo = 4; //通道操作协议 dmx512 memset(ArtPollReply.PortTypes, 0xc0, 4); //节点输入状态 memset(ArtPollReply.GoodInput, 0x08, 4); //节点输出状态 memset(ArtPollReply.GoodOutput, 0x80, 4); //SWIN、SWOUT memcpy(ArtPollReply.SwIn, swin, sizeof(swin)); memcpy(ArtPollReply.SwOut, swout, sizeof(swout)); //视频显示本地数据,己弃用 ArtPollReply.SwVideo = 0; //节点输入 ArtPollReply.SwMacro = 0; //远程触发输入 ArtPollReply.SwRemote = 0; //空字节 ArtPollReply.Spare1 = 0; ArtPollReply.Spare2 = 0; ArtPollReply.Spare3 = 0; //设备功能 Art-Net主从设备 ArtPollReply.Style = 0; //MAC地址 高字节在前 ArtPollReply.Mac[0] = 0x01; ArtPollReply.Mac[1] = 0x02; ArtPollReply.Mac[2] = 0x03; ArtPollReply.Mac[3] = 0x04; ArtPollReply.Mac[4] = 0x05; ArtPollReply.Mac[5] = 0x06; //节点IP memcpy(ArtPollReply.BindIp, ipadd, sizeof(ArtPollReply.BindIp)); ArtPollReply.BindIndex = BindNum; //状态字,端口位数,DHCP配置 ArtPollReply.Status2 = 0x08; //保留字 // ArtPollReply.Filler[0-25] = 0; ptr=pbuf_alloc(PBUF_TRANSPORT,sizeof(ArtPollReply),PBUF_POOL); //申请内存 if(ptr) { pbuf_take(ptr,&ArtPollReply,sizeof(ArtPollReply)); //将tcp_demo_sendbuf中的数据打包进pbuf结构中 udp_send(upcb,ptr); //udp发送数据 pbuf_free(ptr);//释放内存 } }
- 接收
- 总结
- Art-Net属于灯光行业,比较偏门,网上资料相对较少
- 希望这系列文档能略微帮助你解决工作上的疑惑;
08-03
2214
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交