前段时间写了相关在stm32移植w5100网络的相关代码,现在简单介绍一下 比较常用的大数量传输模式udp模式。 相关步骤: 1)使用UDP模式,首先需要配置IP地址和socket的端口号。
2)接收到数据后,前8个字节包括远程主机的IP地址(1-4字节),端口号(5-6字节),数据长度(7-8)字节。
3)发数据前必须配置目标主机IP地址和端口号,也就是接收到数据的前1-6字节。 模式设置: 设置Socket为UDP模式
如果Socket工作在UDP模式,引用该程序。在UDP模式下,Socket通信不需要建立连接
如果设置成功则返回true, 否则返回false
该程序只调用一次,就使W5100设置为UDP模式
-----------------------------------------------------------------------------*/
unsigned char Socket_UDP(SOCKET s)
{
Write_W5100((W5100_S0_MR+s*0x100), S_MR_UDP); /*设置Socket为UDP模式*/
Write_W5100((W5100_S0_CR+s*0x100), S_CR_OPEN); /*打开Socket*/ if(Read_W5100(W5100_S0_SSR+s*0x100)!=S_SSR_UDP)
{
Write_W5100((W5100_S0_CR+s*0x100), S_CR_CLOSE); /*打开不成功,关闭Socket,然后返回*/
return FALSE;
}
else
return TRUE; /*至此完成了Socket的打开和UDP模式设置,在这种模式下它不需要与远程主机建立连接
因为Socket不需要建立连接,所以在发送数据前都可以设置目的主机IP和目的Socket的端口号
如果目的主机IP和目的Socket的端口号是固定的,在运行过程中没有改变,那么也可以在这里设置*/
}
数据处理: /******************************************************************************
处理Socket接收和发送的数据
******************************************************************************/
/*-----------------------------------------------------------------------------
如果Socket产生接收数据的中断,则引用该程序进行处理
该程序将Socket的接收到的数据缓存到Rx_buffer数组中,并返回接收的数据字节数
-----------------------------------------------------------------------------*/
unsigned short S_rx_process(SOCKET s)
{
unsigned short i,j;
unsigned short rx_size,rx_offset;
SPI_InitTypeDef SPI_InitStructure;
/*读取接收数据的字节数*/
rx_size=Read_W5100(W5100_S0_RX_RSR+s*0x100);
rx_size*=256;
rx_size+=Read_W5100(W5100_S0_RX_RSR+s*0x100+1); /*读取接收缓冲区的偏移量*/
rx_offset=Read_W5100(W5100_S0_RX_RR+s*0x100);
rx_offset*=256;
rx_offset+=Read_W5100(W5100_S0_RX_RR+s*0x100+1); i=rx_offset/S_RX_SIZE; /*计算实际的物理偏移量,S0_RX_SIZE需要在前面#define中定义*/
/*注意S_RX_SIZE的值在W5100_Init()函数的W5100_RMSR中确定*/
rx_offset=rx_offset-i*S_RX_SIZE; j=W5100_RX+s*S_RX_SIZE+rx_offset; /*实际物理地址为W5100_RX+rx_offset*/
//SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_4;
//SPI_Init(SPI1,&SPI_InitStructure);
//SPI_Cmd(SPI1,ENABLE);
for(i=0;i
{
if(rx_offset>=S_RX_SIZE)
{
j=W5100_RX+s*S_RX_SIZE;
rx_offset=0;
}
Rx_Buffer=Read_W5100(j); /*将数据缓存到Rx_buffer数组中*/
j++;
rx_offset++;
}
//SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_4;
// SPI_Init(SPI1,&SPI_InitStructure);
//SPI_Cmd(SPI1,ENABLE); /*计算下一次偏移量*/
rx_offset=Read_W5100(W5100_S0_RX_RR+s*0x100);
rx_offset*=256;
rx_offset+=Read_W5100(W5100_S0_RX_RR+s*0x100+1); rx_offset+=rx_size;
Write_W5100((W5100_S0_RX_RR+s*0x100), (rx_offset/256));
Write_W5100((W5100_S0_RX_RR+s*0x100+1), rx_offset); Write_W5100((W5100_S0_CR+s*0x100), S_CR_RECV); /*设置RECV命令,等等下一次接收*/
// while(!W5100_Interrupt);
// W5100_Interrupt = 0;
return rx_size; /*返回接收的数据字节数*/
}
这里简单说一下流程 详情 请看w5100数据手册 |