ZYNQ7020 实现UDP 通信(一)一次传输发送1MB的数据

ZYNQ7020 实现UDP 通信(一)

项目参考
学会Zynq(14)UDP发送Hello World
本文章在上述完整代码基础上实现:
原代码输出——helloworld,一个字符串
本代码输出——1MByte数据,每个数据16位


因为项目需要快速读取PL数据并显示,通过PS-AXI总线读PL,然后用网口输出,(串口传输速度有限)。之前没怎么学过计算机网络,C也是个菜鸡,一步一步来吧。

ZYNQ7020 实现UDP 通信(一)一次传输发送1MB的数据_第1张图片
改变pbuf_alloc申请的数据大小
ZYNQ7020 实现UDP 通信(一)一次传输发送1MB的数据_第2张图片

ZYNQ7020 实现UDP 通信(一)一次传输发送1MB的数据_第3张图片
结果是显而易见的;
如果增加申请的空间大小呢?
ZYNQ7020 实现UDP 通信(一)一次传输发送1MB的数据_第4张图片
ZYNQ7020 实现UDP 通信(一)一次传输发送1MB的数据_第5张图片
0D 归位
0A 换行
00 NULL
00
28 左括号(
9B ???这个搞不懂了,问号应该是3F
00 NULL

这说明申请空间大小要和数据大小严格对应,申请空间不能小于数据长度(就是一部分给砍掉了),也不能大于数据长度(不然就会乱码)。

如果我们把本来应该udp_send的数据先一个个存到ddr里面,有一个num作为计数,然后超过设定值后就把整个数据用udp给读出来,应该是可行的。

---------------------------------分割线 2021.04.03--------------------------------------------
网络发包的一帧的格式如下图所示

ZYNQ7020 实现UDP 通信(一)一次传输发送1MB的数据_第6张图片
也就是说,先把数据堆进一个字符串数组里面,然后达到计数阈值的时候再输出这个字符串数组里面的内容,比如1024长度的数组,那一次发包就相当于传了1KB的数据出来

在这个经典博客的基础上做了一些修改

学会Zynq(14)UDP发送Hello World

主要改动在main函数和user_udp.c里的udp_printf函数上


	num = 1024;
	char send_buff[num] ;//待发送字符,n个字节send_buff[n]
//	for(i=0;i
//	{
//		send_buff[i] = 150;
//	}
	i = 0;
	while(1)
	{
		send_buff[i] = 150;
		i = i+1;
		/*  将MAC队列中的包传输的LwIP/IP栈中   */
		if(i==num)
		{
		xemacif_input(netif);

			if (udp_connected_flag) { //发送
				sleep(1);
				udp_printf(num,send_buff);
				udp_printf(num,send_buff);
			}

		for(i=0;i<num;i++)
			send_buff[i]=0;
		i=0;
		}
	}

这里实现的就是每次从网口读1024个数出来,给定的值就是150,实际中这个字符数据是从别的地方赋值的(比如中断?)。

ZYNQ7020 实现UDP 通信(一)一次传输发送1MB的数据_第7张图片
对UDP不太了解的话,可以试一下把这个num改成1500以上,比如1600,2000看看输出结果是啥~

这是修改的UDP发送函数;


//---------------------------------------------------------
//                   UDP发送数据函数
//---------------------------------------------------------
void udp_printf(uint32_t num, u8 * send_buff)
{
	//char send_buff;
	err_t err;
	uint8_t i;

//	char send_buff[num] ;//待发送字符,n个字节send_buff[n]
//	for(i=0;i
//	{
//		send_buff[i] = 1;
//	}
	///send_buff = "Hello world";
	struct udp_pcb *tpcb = connected_pcb;
	if (!tpcb) {
		xil_printf("error connect.\r\n");
	}
	/*  申请pbuf资源  */
	pbuf_to_be_sent = pbuf_alloc(PBUF_TRANSPORT, num, PBUF_POOL);
	memset(pbuf_to_be_sent->payload, 0, num);
	memcpy(pbuf_to_be_sent->payload, (u8 *)send_buff, num);
	/*  发送字符串  */
	err = udp_send(tpcb, pbuf_to_be_sent);
	if (err != ERR_OK) {
		xil_printf("Error on udp send : %d\r\n", err);
		pbuf_free(pbuf_to_be_sent);
		return;
	}
	pbuf_free(pbuf_to_be_sent);  //释放pbuf
}

记得要修改函数声明
ZYNQ7020 实现UDP 通信(一)一次传输发送1MB的数据_第8张图片

你可能感兴趣的:(ZYNQ,嵌入式,硬件)