【2】嵌入式TCP/IP协议——————Art-Net处理流程

  1. 流程图
  2. 例程
    1. 接收
      1. //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);	//标记连接断开
        	} 
        } 

         

    2. 发送
       /*********************************************************
       * 函数名: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);//释放内存
      	} 
      } 

       

  3. 总结
    1. Art-Net属于灯光行业,比较偏门,网上资料相对较少
    2. 希望这系列文档能略微帮助你解决工作上的疑惑;

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
嵌入式TCP/IP协议单片机技术是指使用单片机作为控制器,通过嵌入式TCP/IP协议栈实现网络通信的技术。嵌入式TCP/IP协议栈是一种轻量级的网络协议栈,它可以在资源有限的环境中实现网络通信功能。 嵌入式TCP/IP协议单片机技术的设计主要包括以下几个方面: 1. 硬件设计:首先需要选择合适的单片机芯片,并根据网络通信的需求设计适配网络通信所需的外围电路,如网口、PHY芯片等。同时,还需要考虑电源管理、时钟同步等方面的设计,以保证系统的稳定性和可靠性。 2. 软件设计:在单片机中,需要嵌入TCP/IP协议栈的软件代码,以实现网络通信功能。通常,我们可以选择现成的开源TCP/IP协议栈进行移植和适配,也可以根据具体的需求进行自主开发。在软件设计中,需要实现TCP/IP协议的各个层次,包括物理层、链路层、网络层和传输层等,并考虑数据的分组、封装、传输和接收等细节。 3. 驱动程序设计:根据所选用的硬件,需要编写相应的驱动程序,以连接单片机和外部硬件,实现数据的输入和输出。例如,对网口的驱动程序设计,可以实现网络数据包的发送和接收。 4. 应用程序设计:通过以上的硬件和软件设计,可以实现基本的网络通信功能。根据具体的应用需求,可以进一步进行应用程序的设计和开发,实现具体的功能,如数据采集、远程控制、数据传输等。 嵌入式TCP/IP协议单片机技术在网络通信中的设计,可以实现在资源受限的环境下进行网络通信,并为各种应用提供了灵活、高效、可靠的解决方案。它被广泛应用于物联网、智能家居、工业控制等领域,为实现设备之间的互联互通提供了重要的技术支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值