一 前言
(1)负责项目中组播开发测试工作。期间由于缺乏设备的原因,中间搁置了好久。直到昨天下午临近下班,终于,完成udp组播整个的开发测试工作。
二 开发过程
(1)首先从实现udp协议说起。udp协议使用的结构体如下:
typedef struct socketaddr {
uint16_t sin_Family; //协议族
uint16_t sin_port; //端口号
uint32_t sin_addr;/*mac[6] / udp/tcp port[2] + ip[4]*/
}SSockAddr;
(2)实现udp协议的几个主要函数,这里不提供详细的源代码,只是提供函数名及其参数,以供参考,回忆复习:
uint8_t fn_W5100S_Socket(uint8_t uc_Minor,uint8_t uc_Type,uint8_t uc_Proto)
{
uint8_t uc_Ret=SYS_YES;
if(uc_Proto==SOCK_DGRAM)
{
W5100S_Init(uc_Minor); //内部网卡初始化
uc_Ret=SYS_YES;
}
else
{
uc_Ret=SYS_NO;
}
return uc_Ret;
}
uint8_t fn_W5100S_Bind(uint8_t uc_Minor,SSockAddr *pst_SockAddr,uint32_t ui_Gw, uint32_t ui_Mask) //绑定网卡,网关
{
SocketTypeDef *Pst_Addr=NULL;
Pst_Addr=(SocketTypeDef *)pst_SockAddr;
W5100S_SetIP(uc_Minor,Pst_Addr->ui_SinAddr,ui_Gw,ui_Mask); //配置局域网,
return 0;
}
uint32_t fn_W5100S_Recvfrom(uint8_t uc_Minor,uint8_t uc_Port,uint8_t auc_RecvBuf[],uint32_t BufLen,SSockAddr *pst_SockAddr)
{
uint32_t ui_Recv_Len=0;
SocketTypeDef *Pst_SocAddr=NULL;
Pst_SocAddr=(SocketTypeDef *)pst_SockAddr;
ui_Recv_Len=RecvFrom_RXQueue(uc_Minor,uc_Port,Pst_SocAddr,auc_RecvBuf,BufLen); //应用读取接收队列中的数据,最终存到了auc_SocAddr中
return ui_Recv_Len;
}
uint8_t fn_W5100S_Sendto(uint8_t uc_Minor,uint8_t uc_Port,uint8_t auc_SendBuf[],uint32_t BufLen,SSockAddr *pst_SockAddr)
{
uint8_t uc_Ret=SYS_YES;
SocketTypeDef *Pst_SocAddr=NULL;
Pst_SocAddr=(SocketTypeDef *)pst_SockAddr;
uc_Ret=WriteDataToSendQueue(uc_Minor,uc_Port,Pst_SocAddr,auc_SendBuf,BufLen);
return uc_Ret;
}
(3)以上程序的叙述,都是从应用层的角度进行分析的,没有提到驱动层的程序,以下简述以下,驱动层的开发:
参考原理图,初始化配置引脚。引脚输入输出模式,选择指定的引脚,时钟配置,等等。
网卡的配置,SRAM,FLASH,等存储空间的配置。参考STM32技术开发手册,网卡配置开发手册等。
驱动开开发是一个需要耐心的工作,认真,仔细,写好程序后,还要编写测试程序,对代码进行检测
驱动开发有趣的地方是,它需要对硬件进行操作,经常用到的设备有:可调节电源,示波器,仿真器,开发板,有时会用到电焊。开发板如下:
(4)组播配置程序,这里应用的网卡是W5100网卡,详细内容参考它的技术开发手册,程序是对直接对寄存器进行操作的,程序如下:
/*设置Socket的传输协议为UDP*/
W5100S_WriteReg(uc_EthNum,W5100S_Sn_Addr(uc_SocketNum,Sn_MR),SN_MR_UDP|SN_MR_MF_ENABLE|SN_MR_MULTI_ENABLE);
/*配置Socket的源UDP端口号*/
Short_To_Byte(auc_Temp,Pst_Addr->sin_port);
W5100S_WriteBuff(uc_EthNum,W5100S_Sn_Addr(uc_SocketNum,Sn_PORTR0),auc_Temp,ARRAY_SIZE(auc_Temp));
uint8_t auc_ip[4]={225,0,0,20}; //目标ip地址
uint8_t auc_port[4]={6,0,0,0}; //目标端口
uint8_t auc_mac[6]={1,0,225,0,0,20}; //目标mac地址
/*配置Socket的 目标端口*/
W5100S_WriteBuff(uc_EthNum,W5100S_Sn_Addr(uc_SocketNum,Sn_DPORTR0),auc_port,4);
//目标ip地址
W5100S_WriteBuff(uc_EthNum,W5100S_Sn_Addr(uc_SocketNum,Sn_DIPR0),auc_ip, 4);
//目标mac地址
W5100S_WriteBuff(uc_EthNum,W5100S_Sn_Addr(uc_SocketNum,Sn_DHAR0),auc_mac, 6);
//udp多播模式,1开启组播 Sn_MR[MULTI] = 1
W5100S_WriteReg(uc_EthNum, W5100S_Sn_Addr(uc_SocketNum,Sn_MR), 0xc2);
/*启动被设置的Socket*/
W5100S_WriteReg(uc_EthNum,W5100S_Sn_Addr(uc_SocketNum,Sn_CR),SN_CR_OPEN);
(5)组播测试环境,两台电脑,一台二层交换机,待测开发板,这是udp组播测试主要的硬件设备。还有其他的像是引脚线,电源,网线等。
(6)组播测试所需要的软件,cmd终端环境,ping指令检测网卡是否配置成功,是否在同一网段,组播测试主要用的软件就是:
(7)将两台电脑,开发板(也可以看作可以独立运行的一个小电脑),通过网线都连接到同一个交换机上,使用ping指令监测三台设备是否在同一个网段。然后启动运行设备,两台电脑都打开,上面的测试工具。
(8)当开发板发送的数据,两台电脑同时都可以收到时,就代表组播程序开发成功了,项目的这一个阶段可以收尾了。哈哈哈哈,我可是忙了好久,才搞成功的。
三 总结
(1)对自己写出的程序要有自信,我写好的程序就是正确的,问题肯定是出在其他的地方。