在做以太网传输实验的时候,在汤老师的例程下进行修改,发现使用tcp_write(),tcp_output()函数长时间使用之后,串口就会报错。解决的办法:在使用一次tcp_write和tcp_output之后就对pbuf进行一次清空。算是瞎猫碰死耗子吧。
还有一点就是传输数据的长度不要超出定义的长度,比如一次传输的数据在0-2000之间,那么我传输的数据就是两个字。
以下是主程序:
int main(void)
{
int Status;
struct netif *netif, server_netif;
struct ip_addr ipaddr, netmask, gw;
err_t err;
/* the mac address of the board. this should be unique per board */
unsigned char mac_ethernet_address[] = { 0x00, 0x0a, 0x35, 0x00, 0x01, 0x02 };
init_intr_sys();
TcpTmrFlag = 0;
netif = &server_netif;
IP4_ADDR(&ipaddr, 192, 168, 1, 10);
IP4_ADDR(&netmask, 255, 255, 255, 0);
IP4_ADDR(&gw, 192, 168, 1, 10);
/*lwip library init*/
lwip_init();
/* Add network interface to the netif_list, and set it as default */
if (!xemac_add(netif, &ipaddr, &netmask, &gw, mac_ethernet_address, XPAR_XEMACPS_0_BASEADDR)) {
xil_printf("Error adding N/W interface\r\n");
return -1;
}
netif_set_default(netif);
/* specify that the network if is up */
netif_set_up(netif);
/* initialize tcp pcb */
tcp_send_init();
Timer_start(&Timer);
while (1)
{
/* call tcp timer every 250ms */
if(TcpTmrFlag)
{
if(request_pcb->state == CLOSED || (request_pcb->state == SYN_SENT && request_pcb->nrtx == TCP_SYNMAXRTX))
{
request_pcb = tcp_new();
if (!request_pcb) {
xil_printf("txperf: Error creating PCB. Out of Memory\r\n");
return -1;
}
//ip_set_option(request_pcb, SOF_REUSEADDR);
err = tcp_connect(request_pcb, &ipaddress, port, tcp_connected_callback);
if (err != ERR_OK) {
xil_printf("txperf: tcp_connect returned error: %d\r\n", err);
return err;
}
}
tcp_tmr();
TcpTmrFlag = 0;
}
/*receive input packet from emac*/
xemacif_input(netif);
/* if connected to the server, start receive data from PL through axidma, then transmit the data to the PC software by TCP*/
if(tcp_client_connected)
send_data();
}
return 0;
}
void send_data()
{
struct pbuf *p;
#if __arm__
int copy = 3;
#else
int copy = 0;
#endif
err_t err;
int Status;
static int yuan;
struct tcp_pcb *tpcb = connected_pcb;
if(num1<2000)
num1++;
else
num1=0;
err = tcp_write(tpcb, &num1, 2, copy);
if (err != ERR_OK) {
xil_printf("txperf: Error on tcp_write: %d\r\n", err);
xil_printf("yuan");
connected_pcb = NULL;
return;
}
err = tcp_output(tpcb);
if (err != ERR_OK) {
xil_printf("txperf: Error on tcp_output: %d\r\n",err);
return;
}
pbuf_free(p);
}
在send_data()函数的前后定义pbuf结构体指针,最后释放。
|